1、C++中的基本类型
类型 含义 大小(bit)
bool 布尔类型 未定义
char 字符 8
wchar_t 宽字符 16
char16_t Unicode 16
char32_t Unicode 32
short 短整形 16
int 整形 16/32
long 长整形 32/64
long long 超长整形(C++11) 64/128
float 单精度浮点 32 6位有效数字
double 双精度浮点 64 10位有效数字
long double 长双精度浮点 96/128 10位有效数字
一个int至少和一个short一样大,一个long至少和int一样大,一个long long至少和一个long一样大,long long是C++11新定义的整数类型。
一般来说,float和double分别有7位和16个有效位,long double通常用于浮点需求的硬件,具体实现不同,精度也会不同。
2、有符号和无符号
除了bool和扩展性字符型(除了char类型的字符型),其他整形可以通过unsigned关键字派生出无符号类型。
例如 unsigned int,unsigned long。其中unsigned int可以缩写为unsigned。
有符号整形的取值为负数,0,正数。
无符号整形的取值为0,正数。无符号由于没有符号位,所以无符号整形可以表示更大的数。
【你造吗?】
【与整形不同,字符型分成了char,unsigned char,signed char三种。特别需要注意的是char和signed char并不一样。虽然字符型有三种,但是字符的表现形式只有两种:有符号,无符号。char实际上表现为哪一种,要依赖于编译器。C++标准并没还有规定char应该如何表示,但是约定了在表示范围内正数和负数应该平衡。因此signed char理论上可以表示-127到127之间的数。通常计算机会将表示范围定位-128到127。】
【学着点!】
【1、当明确得知数值不为负数时,请用无符号类型】
【2、尽量使用int计算,long往往太大,short往往太小,如果你的范围超过了int,更建议用long long】
【3、算数的时候不要用char和bool,有些机器上char是有符号的,有些机器上是无符号的,所以char特别不稳定,但是如果你迫切想使用它来表示一个很小的数,请明确指出是signed char还是unsigned char。】
【4、运算小数的时候尽量用double,float往往会丢失精度,而float和double的运算效率相差无几。而long double一般情况是不会用到的,而它的效率往往不行。】
2、基本类型的类型转换
当我们讲一种类型赋值给另一种类型的时候,系统自动会进行转换。
例如:
bool b = 42; //b为真
int i = b; //i为1
i = 3.14; //i为3
double pi = i; //pi为3.0
unsigned char c = -1; //c为255
signed char c2 = 256; //c2的值为未定义
由上可知:
1、如果把非bool类型的值赋给bool类型,0为false,非0为true;
2、如果把bool类型赋值给非bool类型,true为1,false为0;
3、如果把小数赋给整数类型,结果只保留整数部分;
4、如果把整数赋给小数,小数位为0;
5、如果给无符号类型赋值负数,结果为对无符号表示范围的总数取模。
比如 unsigned char表示范围是0-255,赋值-1就是-1对256取模,得出255。
6、如果赋值的值超出了类型的表示范围,结果是未定义的,程序可能继续工作,可能崩溃,也可能产生垃圾数据。有些编译器会按照5的方式来解决。
把非bool类型放入if条件中,会自动讲该值转换成bool值进行判断。
int a = 3;
if(a)
{
}
//a非0,结果为true
我们也可以讲表达式放入if语句中,例如
if(a-3)
{
}
虽然可以如此做,但是尽量不要,这样会让程序的可读性变差。
3、含有无符号类型的表达式
尽管我们不会故意给无符号对象赋一个负值,但是实际中可能经常无意这么干。
例如,一个算术表达式中既有无符号又有int,那么int会变成无符号。把int转换成无符号数的过程和把int直接赋给无符号变量一样。
usigned u = 10;
int i = -42;
i + i; //结果为-84
i + u; //结果为4294967264,并不是你想要的-32
在i+u运算时,会把int转换成无符号数,那么结果就是-42对int表示的数的数量取模
当无符号数中减去一个值,不管这个值是不是无符号数,我们都要确保结果不能为负
unsigned u1=42,u2=10;
u1 - u2; //32
u2 - u1; //为4294967264
我们如果写一个输出10到0的数,我们会这么写
for (int i = 10; i >= 0;--i)
std::cout << i << endl;
可能你会觉得,反正不会输出负数,那么干脆用无符号来弄吧,于是就有了下面的写法
for (unsigned i = 10; i >= 0;--i)
std::cout << i << endl;
然后这个结果,绝对不是你想要的,因为它是死循环。当i为0时,最后执行--i,本来i应该为-1,但是由于它是无符号数,最后又模回来了,结果就成了很大的数,所以永远不会满足跳出的条件。
对于这种情况,有一个解决办法,用while代替for
unsigned u = 11;
while( u > 0 )
{
--u;
std::cout << u <<endl;
}
【切记】
【最好不要将有符号和无符号同时加入表达式中,这样很容易出错,比如a*b,a=-1,b=1,从表达式的角度看,显然结果是-1,但是如果a是int,b是unsigned,那么结果就是4294967295】