【问题标题】:When adding two short numbers添加两个短数字时
【发布时间】:2017-01-09 22:12:26
【问题描述】:

这里真的很简单的问题。我有一个非常简单的程序,用于将两个数字相加并打印出这些数字的总和(如下)。运行程序时,它按预期工作,并为 20 000 + 20 000 打印出 40 000。但是当我将 int 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);

【问题讨论】:

  • 您的实现中short 的最大值是32767
  • 如果你想要最大 65535,你可以试试unsigned short

标签: c variables int short


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    有符号空头的最大值为 32767

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

    0 11111 11111 11111
    

    如果你加1,它就变成了

    1 00000 00000 00000
    

    返回-32768

    你可能明白了。

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2015-05-04
      • 1970-01-01
      • 2011-08-04
      相关资源
      最近更新 更多