vlambda博客
学习文章列表

C语言编程验证计算机原理的“溢出”

江苏省2020年普通高校对口单招文化统考计算机专业试卷第48题:
某计算机内整型数以2字节补码存储,计算-32767加-2的结果,以十进制表示为   ▲   

这道题很多同学填的是“溢出”。因为2字节补码整数的表示范围是-32768~+32767,-32767加-2的数学值是-32769,确实超出了这个范围。

但是,这道题的答案很可能是32767,因为:
(-32767)补=1000000000000001
(-2)补=1111111111111110
(-32767)补+(-2)补=10111111111111111
最左边的1溢出,余下的0111111111111111即32767

用C语言编程验证一下:
#include <stdio.h>
int main( )
{short int i=-32767,j=-2,k;
//Dev C++5.11中的短整型是2字节 
k=i+j;
printf("k=%d\n",k);
return 0;
}
运行结果:
C语言编程验证计算机原理的“溢出”

那么,这道题到底是填“溢出”呢,还是填“32767”呢?这两个答案都有道理的,但是我们没有看到阅卷评分标准,不知道哪个答案算正确,抑或都算正确?

哪个答案正确先放一边,我们看一看整型数据的溢出问题。
2字节补码整数范围是-32768~+32767,-32767加-2的数学值是-32769,但是计算机中特定情况下因为溢出导致“绕回”,输出32767(-32769绕回到了正向最大值)。
不要认为计算机输出的就一定正确哦。

那么,如果是-32767加-3呢?应该得不到-32770,应该输出32766吧?
编程验证一下:
#include <stdio.h>
int main( )
{short int i=-32767,j=-3,k;
k=i+j;
printf("k=%d\n",k);
return 0;
}
C语言编程验证计算机原理的“溢出”
的确如此。

小游戏1:
(-32767)加多少会绕回成0呢?



答案是
-32769
编程验证一下:
#include <stdio.h>
int main( )
{short int i=-32767,j=-32769,k;
k=i+j;
printf("k=%d\n",k);
return 0;
}
C语言编程验证计算机原理的“溢出”


小游戏2:
已知X、Y为两个带符号的定点整数,在计算机中以16位补码表示,它们为:X=-7FFEH,Y =-3,则[X-Y]补=             



答案是:
32767

解析:
-7FFEH即-32766
7FFEH+(-3)数学值是-32769,但是因为溢出导致绕回至正向最大值,输出32767
照样编程验证一下:
#include <stdio.h>
int main()
{short int x=-0x7FFE,y=-3,z;
z=x+y;
printf("x=%d,y=%d\n",x,y);
printf("z=%d\n",z);
return 0;
}
C语言编程验证计算机原理的“溢出”


PS:
对口单招考试,好多年没有看到官方的答案了,这是怎么了? C语言编程验证计算机原理的“溢出”
网上流传的答案,都是老师自己做的答案。这些网上流传的答案, 有的是错误的 后来 印到一些教辅资料中,几乎变成正确答案了