数据溢出
例如 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的结果为什么是正负交替出现呢? 因为有符号整数在内存中是以补码的形式存放的,
用二进制计算方式,cpu在进行加操作的时候,有可能符号位被1或0覆盖,
所以呈现出有时是+有时是-数的情况 那个2字节是16位 杨艳文 发表于 2019-6-20 23:34
那个2字节是16位
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数部分取反+1 = 27214
哪里不理解可以追问 newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...
比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的基础上变化的。 newu 发表于 2019-6-20 23:48
对的,打开windows自带的计算器算下就好了,
比如:
32767+5555 = 0x95B2 => 除过第一位符号位,整数 ...
计算技巧暂时还没学但是已经理解了许多 本帖最后由 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 是溢出以后的结果。 杨艳文 发表于 2019-6-21 00:06
比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的 ...
?当然你这么理解能解释的通,但事实对于16位有符号整数来说:
0 ~7FFF 表示 0~32767
8000~FFFF 表示 -32768 ~ -1
杨艳文 发表于 2019-6-21 00:06
比如32767+1变成-32768在加32768就变成0了然后再加32768会变成-32768 也就是说这个溢出结果是在32767的 ...
不要想太多溢出不溢出的问题,对与计算机来说,存储的空间是有限的,那么他表示的数也是有限的。
这里计算机就采用了一种叫做“补码”的方式才存储有符号数
jackz007 发表于 2019-6-21 00:15
printf() 函数的输出完全取决于格式描述符,请考察以下代码:
a、b、c、d 的值是正常的,e 是溢出以 ...
了解 newu 发表于 2019-6-21 00:18
不要想太多溢出不溢出的问题,对与计算机来说,存储的空间是有限的,那么他表示的数也是有限的。
这里计 ...
明白了
页:
[1]