重要提示:负数在内存中是补数形式存在!
C++ Primer写到有六种类型转换:
1、非布尔型值-》布尔:如果初始值为0则为false,否则为true;
2、浮点数-》整数:结果值仅保存浮点数中小数点之前的部分;
3、整数-》浮点数:小数部分为0,如果整数占用空间超过浮点数容量,精度有损失;
4、超出范围的值-》无符号类型:对无符号类型取模后的余数;
5、布尔值-》整数类型:false对应0,true对应1;
6、超出范围的值-》带符号类型:未定义。
7、短整型-》无符号长整型:未提到
鉴于第6、7种情况表述为未定义,所以用VS2015亲自试一下:
第6种:
short int x = 65536;
二进制10000000000000000
输出0
二进制 0000000000000000
short int x = 65535;
二进制1111111111111111
输出-1
二进制1111111111111111
short int x = 32768;
二进制1000000000000000
输出-32768
二进制1000000000000000
可见VS2015编译器对于超出长度的值采用的是简单的截断方式。
第7种:
short int x = -32768;
unsigned int y = x;
cout << y << endl;
二进制1000000000000000
输出4294934528
二进制11111111111111111000000000000000
short int x = 32767;
二进制0111111111111111
输出32767
二进制00000000000000000111111111111111
可见VS2015编译器采取的是填充符号位的方式。