添加两个短号时

时间:2016-09-01 21:56:50

标签: c variables int short

这里真的很简单。我有一个非常简单的程序,用于添加两个数字并打印出这些数字的总和(如下)。当运行该程序时,它按预期工作,打印出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);

2 个答案:

答案 0 :(得分:5)

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

如果您更改为unsigned short,则范围变为065525,并且添加将起作用。另外,溢出是用unsigned整数定义的,它只是使用模运算,例如, (unsigned short)65535 + 2 = 1

答案 1 :(得分:1)

签名短片的最大值是32767

在二进制文件中,这是一个16位数字,而不是32位数字(与整数的情况一样)。因为它已签名,所以表示如下:

0 11111 11111 11111

如果你加1,那就变成

1 00000 00000 00000

返回-32768

你可能会有这个想法。