C语言数据溢出问题

DecKen_H 2013-01-03 11:03:22
今天遇到一个关于数据溢出的问题。先贴出代码
#include <stdio.h>
int main(void)
{
short int a=32767,b=32767,c;
a=a+b; //下面三行代码是实现两数交换的功能
b=a-b;
a=a-b;
c=sizeof(short int);
printf("a=%d,b=%d\n",a,b);
printf("sizeof=%d",c);
return 0;
}

编译环境vs2008,short int的是2字节,按照公式计算,short int 能表示最大的正数是32767(2^15-1),看第五行代码a=a+b;调试到该行代码时,a已经变成了-2了(见图一),很明显a已经溢出了,但是最后结果却能得出正确的答案(见图二)。求大婶
图一



图二
...全文
559 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-01-04
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
ww884203 2013-01-03
  • 打赏
  • 举报
回复
就像2楼说的,回绕了。也就是又溢出了一次。 最大正数就是你计算的32767,那么最小负数是多少?就是-32678。可以看到当时a的值是-2,-2减去32767是-32769,同样溢出了,所以就产生了回绕现象。 从内存的角度来看(以16进制表示) a=0x7fff b=0x7fff a+b得0xfffe,也就是-2 b=a-b得0x7fff,也就是32767 a=a-b得0x7fff,也就是32767
DecKen_H 2013-01-03
  • 打赏
  • 举报
回复
引用 2 楼 lin5161678 的回复:
你这里能算出"正确"结果是 回绕了 SHRT_MAX+1 == SHRT_MIN SHRT_MIN-1 == SHRT_MAX 算出的结果自然符合"预期" 要避免有符号数溢出这个未定义行为 是因为不能确保 他可能回绕 也有可能是其他行为
在哪里可以看是否回绕?
DecKen_H 2013-01-03
  • 打赏
  • 举报
回复
不好意思,第二张图片贴错了,现在是更正之后的图片
lin5161678 2013-01-03
  • 打赏
  • 举报
回复
你这里能算出"正确"结果是 回绕了 SHRT_MAX+1 == SHRT_MIN SHRT_MIN-1 == SHRT_MAX 算出的结果自然符合"预期" 要避免有符号数溢出这个未定义行为 是因为不能确保 他可能回绕 也有可能是其他行为
THFG 2013-01-03
  • 打赏
  • 举报
回复
楼主你代码是不是写错了。。。你代码里的a,b值是一样的,你后面贴出来的调试结果a,b是不一样的

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧