C++基本数据类型及类型转换
http://blog.csdn.net/pipisorry/article/details/25346379
c++基本数据类型
什么样的数据算是byte类型,int类型,float类型,double类型,long类型?
byte类型,就是字符类型.这类数据是字符组成的
FLOAT,为数字浮点型,其小数点后面能够跟N个数字
DOUBLE,为双精度数字类型,其小数点后仅仅能有两个数字
int类型
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcGlwaXNvcnJ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" width="584" height="284" />
上面提到了在32位机器和64机器中int类型都占用4个字节。
后来,查了The C Programming language这本书,里面有一句话是这种:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器能够依据自身硬件来选择合适的大小,可是须要满足约束:short和int型至少为16位,long型至少为32位,而且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中通常是32位机器和64位机器中int型都是4个字节(比如。GCC)。
以下列举在GCC编译器下32位机器和64位机器各个类型变量所占字节数:
C类型
| 32 | 64 | |
| char | 1 | 1 |
| short int | 2 | 2 |
| int | 4 | 4 |
| long int | 4 | 8 |
| long long int | 8 | 8 |
| char* | 4 | 8 |
| float | 4 | 4 |
| double | 8 | 8 |
关于带符号与无符号类型:整型 int、stort 和 long 都默觉得带符号型。
要获得无符号型则必须制定该类型为unsigned,比方unsigned long。
unsigned int类型能够简写为unsigned。也就是说,unsigned后不加其它类型说明符就意味着是unsigned int。
c语言中int类型为4bytes(64位机上,32位机应该也是),也就是说总是4bytes而不会变,只是不同语言定义的范围不同,如python中是8bytes(64位机)实际对象占用28bytes。
#include <stdio.h>
#include <limits.h>
int main()
{
printf("The value of INT_MAX is %i\n", INT_MAX);
printf("The value of INT_MIN is %i\n", INT_MIN);
printf("An int takes %ld bytes\n", sizeof(int));
return 0;
}
The value of INT_MAX is 2147483647
The value of INT_MIN is -2147483648
An int takes 4 bytes
一字节表示八位,即:1byte = 8 bit;
int: 4byte = 32 bit 有符号signed范围:2^31-1 ~ -2^31即:2147483647 ~ -2147483648 无符号unsigned范围:2^32-1 ~ 0即:4294967295 ~ 0
long: 4 byte = 32 bit 同int型
double: 8 byte = 64 bit 范围:1.79769e+308 ~ 2.22507e-308
long double: 12 byte = 96 bit 范围: 1.18973e+4932 ~ 3.3621e-4932
float: 4 byte = 32 bit 范围: 3.40282e+038 ~ 1.17549e-038
int、unsigned、long、unsigned long 、double的数量级最大都仅仅能表示为10亿,即它们表示十进制的位数不超过10个,即能够保存全部9位整数。
而short仅仅是能表示5位。
c++类型转换
1. c++中string到int的转换
1) 在C标准库里面。使用atoi:
#include <cstdlib>
#include <string>std::string text = "152";
int number = std::atoi( text.c_str() );
if (errno == ERANGE) //可能是std::errno
{
//number可能因为过大或过小而不能全然存储
}
else if (errno == ??
?
?
)
//可能是EINVAL
{
//不能转换成一个数字
}
2) 在C++标准库里面。使用stringstream:(stringstream 能够用于各种数据类型之间的转换)
#include <sstream>
#include <string>std::string text = "152";
int number;
std::stringstream ss;ss << text;//能够是其它数据类型
ss >> number; //string -> int
if (! ss.good())
{
//发生错误
}ss << number;// int->string
string str = ss.str();
if (! ss.good())
{
//发生错误
}
3) 在Boost库里面,使用lexical_cast:
#include <boost/lexical_cast.hpp>
#include <string>try
{
std::string text = "152";
int number = boost::lexical_cast< int >( text );
}
catch( const boost::bad_lexical_cast & )
{
//转换失败
}
int转换成string
c++中将输入的数字以字符(串)形式输出
- #include <iostream>
- #include <sstream>
- #include <string>
- using namespace std;
- void main(){
- int i = 65;
- cout<<char(i)<<endl; //输出‘A' <=>printf("%c\n", i);
- stringstream ss;
- ss<<i;
- string s;
- ss>>s;
- cout<<s<<endl; //输出”65“
- char *c = new char;
- itoa(65, c, 10);
- cout<<c<<endl; //输出”65“
- //cout<<strcmp(c, "65")<<endl;
- }
[http://bbs.csdn.net/topics/390401758?
page=1#post-394058528]
2.string 转 CString
CString.format(”%s”, string.c_str());
用c_str()确实比data()要好;
3.char 转 CString
CString.format(”%s”, char*);
4.char 转 string
string s(char *);
仅仅能初始化。在不是初始化的地方不妨用assign().
5.string 转 char *
char *p = string.c_str();
6.CString 转 string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
7.字符串的内容转换为字符数组和C—string
(1) data(),返回没有”\0“的字符串数组
(2) c_str(),返回有”\0“的字符串数组
(3) copy()
8.CString与int、char*、char[100]之间的转换
(1) CString互转int
将字符转换为整数。能够使用atoi、_atoi64或atol。而将数字转换为CString变量,能够使用CString的Format函数。如
CString s;
int i = 64;
s.Format(”%d”, i)
Format函数的功能非常强。值得你研究一下。
void CStrDlg::OnButton1()
{
CString
ss=”1212.12″;
int temp=atoi(ss);
CString aa;
aa.Format(”%d”,temp);
AfxMessageBox(”var is ” + aa);
}
(2) CString互转char*
///char * TO cstring
CString strtest;
char * charpoint;
charpoint=”give string a value”; //?
strtest=charpoint;
///cstring TO char *
charpoint=strtest.GetBuffer(strtest.GetLength());
(3) char *转成CString
标准C里没有string,char *==char []==string, 能够用CString.Format(”%s”,char *)这种方法来将char *转成CString。
要把CString转成char *,用操作符(LPCSTR)CString就能够了。
CString转换 char[100]
char a[100];
CString str(”aaaaaa”);
strncpy(a,(LPCTSTR)str,sizeof(a));
static_cast类型转换
static_cast < type-id > ( expression )
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
|
1
2
3
|
inti;
floatf = 166.71;
i = static_cast<int>(f);
|
比方:
|
1
2
3
|
inti;
char*p = "This is an example.";
i = reinterpret_cast<int>(p);
|
尽管const_cast是用来去除变量的const限定,可是static_cast却不是用来去除变量的static引用。
事实上这是非常easy理解的。static决定的是一个变量的作用域和生命周期。比方:在一个文件里将变量定义为static,则说明这个变量仅仅能在本Package中使用;在方法中定义一个static变量,该变量在程序開始存在直到程序结束;类中定义一个static成员,该成员随类的第一个对象出现时出现,而且能够被该类的全部对象所使用。对static限定的改变必定会造成范围性的影响,而const限定的仅仅是变量或对象自身。
但不管是哪一个限定,它们都是在变量一出生(完毕编译的时候)就决定了变量的特性。所以实际上都是不容许改变的。这点在const_cast那部分就已经有体现出来。
static_cast和reinterpret_cast一样。在面对const的时候都无能为力:两者都不能去除const限定。两者也存在的非常多的不同,比方static_cast不仅能够用在指针和引用上。还能够用在基础数据和对象上;reinterpret_cast能够用在"没有关系"的类型之间,而用static_cast来处理的转换就须要两者具有"一定的关系"了。
reinterpret_cast能够在随意指针之间进行互相转换。即使这些指针所指的内容是毫无关系的。也就是说一下语句,编译器是不会报错的,可是对于程序来说也是毫无意义可言的。仅仅会造成程序崩溃
unsignedshort Hash( void *p ) {
unsignedlong val = reinterpret_cast<unsignedlong>( p );
return ( unsigned short )( val ^ (val >> 16));
}
int main() {
typedefunsignedshort (*FuncPointer)( void *) ;
FuncPointer fp = Hash; //right,this is what we want
int a[10];constint* ch = a; //right, array is just like pointer
char chArray[4] = {'a','b','c','d'};
fp = reinterpret_cast<FuncPointer> (ch); //no error, but does not make sense
ch = reinterpret_cast<int*> (chArray); //no error
cout <<hex<< *ch; //output: 64636261 //it really reinterpret the pointer
}
而以上转换,都是static_cast所不能完毕的任务,也就是说把上边程序里全部的reinterpret_cast换成static_cast的话,就会马上得到编译错误,因为目标指针和原始指针之间不存在"关系"
从上边的程序,也就一下子看出来了reinterpret_cast和static_cast之间最本质的差别。
可是从基类到子类的转换。用static_cast并非安全的,详细的问题会在dynamic_cast一篇阐述。
在指针和引用方便,似乎也仅仅有继承关系是能够被static_cast接受的,其它情况的指针和引用转换都会被static_cast直接扔出编译错误。而这层关系上的转换又差点儿都能够被dynamic_cast所取代。这样看起来static_cast运算符的作用就太小了。
实际上static_cast真正用处并不在指针和引用上。而在基础类型和对象的转换上 。
而基于基础类型和对象的转换都是其它三个转换运算符所办不到的
from: http://blog.csdn.net/pipisorry/article/details/25346379
ref:
C++基本数据类型及类型转换的更多相关文章
- java与.net比较学习系列(3) 基本数据类型和类型转换
在Java中,数据类型分为两类,一类是基本数据类型,另外一类是引用类型. 而在C#中,数据类型分为三类,分别是基元类型,值类型和引用类型.其中基元类型是.net framework框架中预定义的类型, ...
- 【转】java与.net比较学习系列(3) 基本数据类型和类型转换
原文地址:https://www.cnblogs.com/mcgrady/p/3397874.html 阅读目录 一,整数类型 二,浮点数类型 三,字符类型 四,布尔类型 五,类型转换之自动转换 六, ...
- 大数据学习--day02(标识符、变量、数据类型、类型转换、进制转换、原码反码补码)
标识符.变量.数据类型.类型转换.进制转换.原码反码补码 标识符: java50个关键字不能做标识符,以数字开头不能做标识符(这个老是忘记写一个类名的时候) 变量: 变量分为成员变量和局部变量,注意作 ...
- python入门4 python查看数据类型及类型转换
查看数据类型:type() 类型转换:int(),float(),char(),ord(),str(),bool() #coding:utf-8 #/usr/bin/python "&quo ...
- 【Python系统学习02】数据类型与类型转换
一.数据类型 字符串 整数 浮点数 [补充中...] 1.字符串 str 字符串:英文string,简写str. name = '小石头:' print(name,'2019', '12', '24' ...
- 2 JavaScript输出&字面量&变量&操作符&语句&标识符和关键字&字符集&语句&数据类型与类型转换
JS输出: JavaScript没有任何打印或者输出的函数,但是可以用不同的方式输出数据 window.alert():弹出警告框 document.write():写入文档 innerHTML:写入 ...
- 02-JS中的数据类型及类型转换
02-JS中的数据类型及类型转换 一.数据类型 JS中的值,无论是字面量还是变量,都有明确的类型. (一)概述 1.基本类型5种 number 数字类型 string 字符串类型 boolean 布尔 ...
- SSIS 数据类型和类型转换
在进行ETL开发时,数据类型(Data Type)是最基础的,但也容易被忽略,楼主使用的SQL Server 版本是2012,用此博文记录,常用的SSIS数据类型和TSQL数据类型的映射.SSIS的数 ...
- 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别
3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...
- .net学习之.net和C#关系、运行过程、数据类型、类型转换、值类型和引用类型、数组以及方法参数等
1..net 和 C# 的关系.net 是一个平台,C#是种语言,C#语言可以通过.net平台来编写.部署.运行.net应用程序,C#通过.net平台开发.net应用程序2..net平台的重要组成FC ...
随机推荐
- 转 使用putty从linux主机上面往windows主机下面拷贝文件
更新一下,把putty的包解压以后,想要在dos窗口中直接使用,必须把putty解压的文件的路径添加到环境变量中,这样使用起来就会非常简单了. 郁闷了好久,终于搞定了putty的上传下载文件命令psc ...
- 标准C程序设计七---120
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- ASP.NET路由应用及IIS配置(非MVC)
一.前后台代码: Global.cs: using System.Web.Routing; ... void Application_Start(object sender, EventArgs e) ...
- JSONP简单示例
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- iOS11及Xcode9适配问题汇总
UIScrollView and UITableView的新特性 ScrollView 如果有一些文本位于UI滚动视图的内部,并包含在导航控制器中,现在一般navigationContollers会传 ...
- git移除上一次的commit中误添加的文件
在使用git进行版本管理时,往往会出现一些误操作,比如将一些不加上传的文件放到了暂存区,即上传到了上一次commit中 比如: commit c134ab90ca7c4daf8bfa22e3ad706 ...
- stun简介
转载 http://blog.csdn.net/mazidao2008/article/details/4934257 STUN(Simple Traversal of UDP over NATs,N ...
- SG函数学习总结
有点散乱, 将就着看吧. 首先是博弈论的基础, 即 N 和 P 两种状态: N 为必胜状态, P 为必败状态. 对于N, P两种状态, 则有 1. 没有任何合法操作的状态, P; 2. 可以移动到P局 ...
- 转:关于使用ImageMagick和Tesseract进行简单数字图像识别
据说Tesseract可是世界排名第三的OCR神器,2010年又更新了3.0版本.Tesseract原先是HP写的,现在Open Source了. 下面介绍怎么用Tesseract配合ImageMag ...
- Maven创建Web工程并执行构建/测试/打包/部署
创建工程基本参考上一篇Java Application工程,不同的是命令参数变了,创建Web工程的命令如下: mvn archetype:generate -DgroupId=com.jsoft.te ...