这里真的很简单。我有一个非常简单的程序,用于添加两个数字并打印出这些数字的总和(如下)。当运行该程序时,它按预期工作,打印出40 000 20 000 + 20 000.但当我将a,b和sum改为 short a,b和sum时,我得到-25 536作为答案。谁能解释为什么会这样?我有一个想法,但很想从知道它的人那里听到它。谢谢你的阅读。
int a, b, sum;
a = 20000; b = 20000; sum = a+b;
printf("%d + %d = %d\n", a, b, sum);
答案 0 :(得分:5)
在您的系统上,short
大概是16位,因此值范围为-32768
到32767
。 20000 + 20000
大于最大值,因此会导致溢出,从而导致未定义的行为。
如果您更改为unsigned short
,则范围变为0
到65525
,并且添加将起作用。另外,溢出是用unsigned
整数定义的,它只是使用模运算,例如, (unsigned short)65535 + 2 = 1
。
答案 1 :(得分:1)
签名短片的最大值是32767
在二进制文件中,这是一个16位数字,而不是32位数字(与整数的情况一样)。因为它已签名,所以表示如下:
0 11111 11111 11111
如果你加1,那就变成
1 00000 00000 00000
返回-32768
你可能会有这个想法。