添加两个短号码时

When adding two short numbers

这里的问题很简单。我有一个非常简单的程序,用于将两个数字相加并打印出这些数字的总和(如下)。当 运行 程序时,它按预期工作并打印出 40 000 为 20 000 + 20 000。但是当我将 int a, b 和 sum 更改为 short a,b总而言之,我得到 -25 536 作为答案。谁能解释为什么会这样?我有一个想法,但很想听听知道它的人的意见。感谢阅读。

int a, b, sum;

a = 20000;  b = 20000;  sum = a+b;
printf("%d + %d = %d\n", a, b, sum);

在您的系统上,short 大概是 16 位,因此值的范围是 -327683276720000 + 20000 大于最大值,因此这会导致溢出,从而导致未定义的行为。

如果改成unsigned short,范围就变成065525,加法就可以了。此外,溢出是用 unsigned 整数明确定义的,它简单地使用模块化算法环绕,例如(unsigned short)65535 + 2 = 1.

一个带符号的short的最大值是32767

在二进制中,这是一个 16 位数字,而不是 32 位数字(整数就是这种情况)。因为是有符号的,所以表示如下:

0 11111 11111 11111

如果你给它加 1,它就变成了

1 00000 00000 00000

这又回到了-32768

你大概明白了。