鱼C论坛

 找回密码
 立即注册
查看: 3658|回复: 8

[迷途问路] 有关short的溢出问题~~~~~标题要长~~~~~~

[复制链接]
发表于 2013-2-13 17:53:43 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 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,应该是自己对数据的溢出理解的不够,还请大家帮帮我~~~谢谢了!










想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-2-13 18:35:53 | 显示全部楼层
非常想帮你,。
能告诉我你用哪个IDE么,应该不是VC6吧。。
第二个代码
#include<stdio.h>
void main()
{
short a,b;
a=32767;
b=1;
printf("%d",b+1);
system("pause");
}
目测输出结果应该是2啊,为什么是23768呢。。。
还有提醒下楼主下次放代码用论坛的代码功能,不然我们复制要删一堆乱七八糟字符很费时的哦。
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-13 21:27:36 | 显示全部楼层

啊,刚刚那个打错了,是a=b,还有字符 的问题我还是第一次来,不好意思啊~~~这个那帮我吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-13 21:28:15 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-2-13 18:35
非常想帮你,。
能告诉我你用哪个IDE么,应该不是VC6吧。。
第二个代码

是a+b~~~a+b啊~~VC2010的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-13 21:43:55 | 显示全部楼层
Monkey♂yo 发表于 2013-2-13 21:28
是a+b~~~a+b啊~~VC2010的

你把两个代码完整打一遍好了,一会儿a=b一会儿a+b,不知道哪个是哪个
如果我有装VS2010可以根据结果推出,但我只有VC6和VS2008啊。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-13 21:47:23 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-2-13 21:43
你把两个代码完整打一遍好了,一会儿a=b一会儿a+b,不知道哪个是哪个
如果我有装VS2010可以根据结果推出 ...

大哥,我应该是改好了~~基本上我看过没有问题了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-13 22:04:51 | 显示全部楼层
Monkey♂yo 发表于 2013-2-13 21:47
大哥,我应该是改好了~~基本上我看过没有问题了~

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


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

听不懂不要紧,是汇编的东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-2-13 22:15:41 | 显示全部楼层
メ㊣逆ご帅☆ 发表于 2013-2-13 22:04
我看了下反汇编代码,这个涉及到汇编的问题,你可以懂,也可以暂时不懂
那么我简单给你讲讲
首先讲溢出 ...

谢谢你了,哥~~~看了三遍,有点懂了。汇编这东西要怎么学,可以和C一起同步吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-2-13 23:39:01 | 显示全部楼层
Monkey♂yo 发表于 2013-2-13 22:15
谢谢你了,哥~~~看了三遍,有点懂了。汇编这东西要怎么学,可以和C一起同步吗?


对内存地址之类有比较不错的认识的话,可以同步哦(比较轻松)
也可以不考虑直接同步,鱼油很多这样做,可能有点不轻松但成长很快的
记得书上作业和实验题得完成才往下学习,这样知识比较牢固。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 19:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表