杨艳文 发表于 2019-6-20 22:42:20

数据溢出

例如 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的结果为什么是正负交替出现呢?

newu 发表于 2019-6-20 23:33:04

因为有符号整数在内存中是以补码的形式存放的,
用二进制计算方式,cpu在进行加操作的时候,有可能符号位被1或0覆盖,
所以呈现出有时是+有时是-数的情况

杨艳文 发表于 2019-6-20 23:34:21

那个2字节是16位

newu 发表于 2019-6-20 23:48:08

杨艳文 发表于 2019-6-20 23:34
那个2字节是16位

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

哪里不理解可以追问

杨艳文 发表于 2019-6-21 00:06:25

newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...

比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的基础上变化的。

杨艳文 发表于 2019-6-21 00:09:58

newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...

计算技巧暂时还没学但是已经理解了许多

jackz007 发表于 2019-6-21 00:15:16

本帖最后由 jackz007 于 2019-6-21 00:20 编辑

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

int main()
{
   short a , b , c , d , e                                                            ;
   a = 32767                                                                            ;
   b = a + 1                                                                            ;
   c = a + 555                                                                        ;
   d = a + 5555                                                                         ;
   e = a + 55555                                                                        ;
   printf("a = %6d , b = %6d , c = %6d , d = %6d , e = %6d\n" , a , b , c , d , e)      ;
   printf("a = %6hu , b = %6hu , c = %6hu , d = %6hu , e = %6hu\n" , a , b , c , d , e) ;
}

    a、b、c、d 的值是正常的,e 是溢出以后的结果。

newu 发表于 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

newu 发表于 2019-6-21 00:18:31

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

不要想太多溢出不溢出的问题,对与计算机来说,存储的空间是有限的,那么他表示的数也是有限的。
这里计算机就采用了一种叫做“补码”的方式才存储有符号数

杨艳文 发表于 2019-6-21 02:04:37

jackz007 发表于 2019-6-21 00:15
printf() 函数的输出完全取决于格式描述符,请考察以下代码:

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

了解

杨艳文 发表于 2019-6-21 02:05:11

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

明白了
页: [1]
查看完整版本: 数据溢出