鱼C论坛

 找回密码
 立即注册
查看: 2720|回复: 10

[已解决]数据溢出

[复制链接]
发表于 2019-6-20 22:42:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
例如 short int有2字节也就是8位  如果设计这样一个程序
#include <stdio.h>

void main()
{
    short int   a,b;
     a=32767;
     b=a+1;
     printf(“%d”,b);
}
  这样溢出结果为-32768  那么请问如果a+5555与a+55555或者a+555555的结果为什么是正负交替出现呢?  
最佳答案
2019-6-20 23:48:08


对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数部分取反+1 = 27214

哪里不理解可以追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-20 23:33:04 | 显示全部楼层
因为有符号整数在内存中是以补码的形式存放的,
用二进制计算方式,cpu在进行加操作的时候,有可能符号位被1或0覆盖,
所以呈现出有时是+有时是-数的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-20 23:34:21 | 显示全部楼层
那个2字节是16位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-20 23:48:08 | 显示全部楼层    本楼为最佳答案   


对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数部分取反+1 = 27214

哪里不理解可以追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-21 00:06:25 | 显示全部楼层
newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...

比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的基础上变化的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-21 00:09:58 | 显示全部楼层
newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...

计算技巧暂时还没学  但是已经理解了许多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-21 00:15:16 | 显示全部楼层
本帖最后由 jackz007 于 2019-6-21 00:20 编辑

printf() 函数的输出完全取决于格式描述符,请考察以下代码:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.      short a , b , c , d , e                                                              ;
  5.      a = 32767                                                                            ;
  6.      b = a + 1                                                                            ;
  7.      c = a + 555                                                                          ;
  8.      d = a + 5555                                                                         ;
  9.      e = a + 55555                                                                        ;
  10.      printf("a = %6d , b = %6d , c = %6d , d = %6d , e = %6d\n" , a , b , c , d , e)      ;
  11.      printf("a = %6hu , b = %6hu , c = %6hu , d = %6hu , e = %6hu\n" , a , b , c , d , e) ;
  12. }
复制代码

    a、b、c、d 的值是正常的,e 是溢出以后的结果。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-6-21 00:15:32 | 显示全部楼层
杨艳文 发表于 2019-6-21 00:06
比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的 ...

?当然你这么理解能解释的通,但事实对于16位有符号整数来说:
0     ~7FFF 表示 0~32767
8000~FFFF 表示 -32768 ~ -1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-21 00:18:31 | 显示全部楼层
杨艳文 发表于 2019-6-21 00:06
比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的 ...

不要想太多溢出不溢出的问题,对与计算机来说,存储的空间是有限的,那么他表示的数也是有限的。
这里计算机就采用了一种叫做“补码”的方式才存储有符号数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-21 02:04:37 | 显示全部楼层
jackz007 发表于 2019-6-21 00:15
printf() 函数的输出完全取决于格式描述符,请考察以下代码:

    a、b、c、d 的值是正常的,e 是溢出以 ...

了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-21 02:05:11 | 显示全部楼层
newu 发表于 2019-6-21 00:18
不要想太多溢出不溢出的问题,对与计算机来说,存储的空间是有限的,那么他表示的数也是有限的。
这里计 ...

明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 20:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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