数值溢出问题
1.对于有符号的,可以看成已知补码求源码。
2.对于无符号的,超出的直接阶段.
如:
--One:
char a = 255;
printf( "%d",c) ---> -1;
255二进制:1111 1111
那么看成补码求源码:1000 0000 + 1 = 1000 0001 == -1;
--Two:
char c = 128;
printf( "%d",c) ---> -128;
128二进制:1000 0000
那么看成补码求源码:1111 1111 + 1 = 1000 0000 == -128;
问题1:
进行补码求源码时,符号位不变,其余取反,再+1,但+1时符号位参不参加?
问题2:
从One+Two求出的码来看,Two把符号位算进了数值里,但One却没有,这是为什么?是临界的特殊情况?
还是我的是错的?
[解决办法]
补码求原码时,符号位不参加运算。
在你的例子中,255(0xff, 1111 1111), 高位1111 1111为1, 所以是个负数,数值位0111 1111取反后0000 0000,再加1的到0000 0001 , 数值为的值为1,符号是-,所以输出-1
128(1000 0000)的高位是1, 所以也是个负数, 数值为全反+1后得到1000,0000(128),所以输出-128
[解决办法]
两个例子的原理是一样的:
char c = 255 (char c的二进制源码为:1111 1111,char c的二进制补码同为:1111 1111);
printf("%d",c);首先将c扩展成int型,即把char c的1个字节的补码表示转成4个字节的int型,由于char c共8位,最高位为符号位,并且值为1,所以扩展后高位补1,结果是: 1111 1111 1111 1111 1111 1111 1111 1111,转成源码时,为符号位不变,其余位取反+1,得1000 0000 0000 0000 0000 0000 0000 0001得值为 -1。
同理:
char c = 128(char c的补码为 1000 0000)
printf("%d",c) 扩展到int的补码结果是1111 1111 1111 1111 1111 1111 1000 0000,符号位不变,其它位取反加1结果为1000 0000 0000 0000 0000 0000 1000 0000 即为 -128
[解决办法]