Monkey♂yo 发表于 2013-2-13 17:53:43

有关short的溢出问题~~~~~标题要长~~~~~~

本帖最后由 Monkey♂yo 于 2013-2-13 22:03 编辑

首先在这里祝大家新快乐呀,小弟初来乍到,而且还是刚刚学习的C。求哥哥、姐姐们帮下忙~~~小弟感激不尽啊。有些有问题的地方大家还多多指点~~~谢谢大家~~~
#include<stdio.h>
void main()
{
      short a,b;
      a=32767;
      b=a+1;
      printf("%d",b);
      system("pause");}
这时b输出的结果是-23768也就是说这时,产生了数据溢出。但用下面的这条C,却没有产生数据溢出~~~#include<stdio.h>
void main()
{
      short a,b;
      a=32767;
      b=1;
      printf("%d",a+b);
      system("pause");}
b输出的结果是23768,用的都是short,不知道为什么,因为是新手,刚学不久,求人帮忙呀~~~~刚刚自己又试过了,写了第三种,中间用了一个c过度下的,
a=23767;
b=1;
c=a+b;
然后再用printf输出c,结果是-23768,应该是自己对数据的溢出理解的不够,还请大家帮帮我~~~谢谢了!










メ㊣逆ご帅☆ 发表于 2013-2-13 18:35:53

非常想帮你,。{:5_100:}
能告诉我你用哪个IDE么,应该不是VC6吧。。
第二个代码
#include<stdio.h>
void main()
{
short a,b;
a=32767;
b=1;
printf("%d",b+1);
system("pause");
}
目测输出结果应该是2啊,为什么是23768呢。。。
还有提醒下楼主下次放代码用论坛的代码功能,不然我们复制要删一堆乱七八糟字符很费时的哦。

Monkey♂yo 发表于 2013-2-13 21:27:36

メ㊣逆ご帅☆ 发表于 2013-2-13 18:35 static/image/common/back.gif
非常想帮你,。
能告诉我你用哪个IDE么,应该不是VC6吧。。
第二个代码


啊,刚刚那个打错了,是a=b,还有字符 的问题我还是第一次来,不好意思啊~~~这个那帮我吗?

Monkey♂yo 发表于 2013-2-13 21:28:15

メ㊣逆ご帅☆ 发表于 2013-2-13 18:35 static/image/common/back.gif
非常想帮你,。
能告诉我你用哪个IDE么,应该不是VC6吧。。
第二个代码


是a+b~~~a+b啊~~VC2010的

メ㊣逆ご帅☆ 发表于 2013-2-13 21:43:55

Monkey♂yo 发表于 2013-2-13 21:28 static/image/common/back.gif
是a+b~~~a+b啊~~VC2010的

你把两个代码完整打一遍好了,一会儿a=b一会儿a+b,不知道哪个是哪个
如果我有装VS2010可以根据结果推出,但我只有VC6和VS2008啊。。

Monkey♂yo 发表于 2013-2-13 21:47:23

メ㊣逆ご帅☆ 发表于 2013-2-13 21:43 static/image/common/back.gif
你把两个代码完整打一遍好了,一会儿a=b一会儿a+b,不知道哪个是哪个
如果我有装VS2010可以根据结果推出 ...
大哥,我应该是改好了~~基本上我看过没有问题了~

メ㊣逆ご帅☆ 发表于 2013-2-13 22:04:51

Monkey♂yo 发表于 2013-2-13 21:47 static/image/common/back.gif
大哥,我应该是改好了~~基本上我看过没有问题了~

我看了下反汇编代码,这个涉及到汇编的问题,你可以懂,也可以暂时不懂
那么我简单给你讲讲
首先讲溢出的那个代码
在b=a+1的操作中
它首先将a的值32767取出来放到寄存器EAX中(汇编概念),
然后由于是SHORT是两个字节的所以用EAX的低16位(刚好两个字节)AX寄存器进行传送,传送到变量b中
由于是有符号的,所以二进制的最高位作为符号位,最高位是1所以变成负数


接下来就是没有溢出的
在printf中a+b这个东西是临时的,不会对任何变量产生影响,编译器无法判断占多少字节,只好按照国际惯例用4个字节的EAX来进行传送,于是不会溢出

听不懂不要紧,是汇编的东西

Monkey♂yo 发表于 2013-2-13 22:15:41

メ㊣逆ご帅☆ 发表于 2013-2-13 22:04 static/image/common/back.gif
我看了下反汇编代码,这个涉及到汇编的问题,你可以懂,也可以暂时不懂
那么我简单给你讲讲
首先讲溢出 ...

谢谢你了,哥~~~看了三遍,有点懂了。汇编这东西要怎么学,可以和C一起同步吗?

メ㊣逆ご帅☆ 发表于 2013-2-13 23:39:01

Monkey♂yo 发表于 2013-2-13 22:15 http://bbs.fishc.com/static/image/common/back.gif
谢谢你了,哥~~~看了三遍,有点懂了。汇编这东西要怎么学,可以和C一起同步吗?

对内存地址之类有比较不错的认识的话,可以同步哦(比较轻松)
也可以不考虑直接同步,鱼油很多这样做,可能有点不轻松但成长很快的
记得书上作业和实验题得完成才往下学习,这样知识比较牢固。
页: [1]
查看完整版本: 有关short的溢出问题~~~~~标题要长~~~~~~