首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

数值溢出有关问题

2012-09-06 
数值溢出问题1.对于有符号的,可以看成已知补码求源码。2.对于无符号的,超出的直接阶段.如:--One:char a 2

数值溢出问题
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
[解决办法]

探讨

谢谢各位的回答!!

我还有疑问:
---mujiok2003:
"128(1000 0000)的高位是1, 所以也是个负数, 数值为全反+1后得到1000,0000(128),所以输出-128".
取反+1操作应该只作用于后7位,最后+1使得多了一位,那么为什么不直接截掉喃而同符号位共同占用第一位?

---ygliang2009:
谢谢提醒printf("%d",c)转int……

[解决办法]
探讨
1.对于有符号的,可以看成已知补码求源码。
2.对于无符号的,超出的直接阶段.

如:
--One:
char a = 255;
printf( "%d",c) ---> -1;
255二进制:1111 1111
那么看成补码求源码:1000 0000 + 1 = 1000 0001 == -1;

--Two:
char c……

[解决办法]
可以看下我总结的基本数据之间的转换
http://blog.csdn.net/dazhong159/article/details/7827919

热点排行