1.截断
截断:当数据大小超过本身类型的最大值或者最小值时,就会进行截断。
截断从左侧开始,保留右侧数值。
例如:
无符号整形a的二进制数为 11111111111111111111111111111111
当进行a+1运算时,a+1的二进制数为100000000000000000000000000000000
因为整形变量为四个字节,一个字节两个比特位,一个比特位为2*10^4,此时大于2*10^32就会从左侧开始进行进行截断。
截断前100000000000000000000000000000000
截断后 00000000000000000000000000000000
此时无符号整形a的值即为0;
++
在此有个更好的例子来解释
1的二进制补码为01111111111111111111111111111111
-1的二进制数补码为11111111111111111111111111111111
相加即为100000000000000000000000000000000
此时超过4个字节的大小,从左侧开始发生截断,直至为4个字节大小时停止,此时将一截断
得到二进制数00000000000000000000000000000000为零。
2.截断与整形提升
unsigned char 0~255
signed char -128~127
整形提升:简单来说就是,当某一类型的一个变量在使用时,这个变量它的类型小于一个整形时,
在进行使用时就会进行整形提升(有符号(signed)按照高位补数,无符号(unsigned)直接补零)。
例如:
1.
我们先看a1
-1的二进制原码为10000000000000000000000000000001
反码 1111111111111111111111111111111111110
补码 1111111111111111111111111111111111111
截断 11111111
整型提升
因为a为有符号字符型变量,所以按位补最高位
11111111111111111111111111111111(内存中补码)
1000000000000000000000000000(反码)
1000000000000000000000000001 (输出原码)
char a=-1;
but
当目光来到 unsigned char a3 时
-1的二进制原码为10000000000000000000000000000001
反码 1111111111111111111111111111111111110
补码 1111111111111111111111111111111111111
截断 11111111
————因为无符号整型提升默认补零————
整形提升
00000000000000000000000011111111(正数,补码即原码)
所以a3=255;
i是为了证明在储存时就已经进行了截断和整形提升。
2.
当在有符号类型变量整形提升时被打印为无符号整形时,在打印时会默认此变量为正数,直接进行打印,不再转码。
128的二进制为00000000000000000000000010000000(原码)
011111111111111111111111111011111111(反码)
01111111111111111111111111111000000(补码(储存在内存中的为补码))
因为a为字符型变量,所以发生截断
a-->10000000
当进行无符号打印时由于a为有符号字符型变量,所以此时整型提升按最高位补数。
a-->11111111111111111111111110000000
当进行无符号打印时,编译器会默认该数为整数,不在考虑符号位。
此时a的值就为4294967168
———————————————————————————————————————————
ps.无符号变量没有符号位,就比如:
signed char 的取值范围为-128~127
而unsigned char 的取值范围就为0~255
———————————————————————————————————————————
同时看第二张图
a-->-128
按照上述方法也可得出此值。