添加两个正16位整数后,为什么会得到负整数?

时间:2018-05-05 14:38:04

标签: go

我是golang的新手,实际上,我是基于类型编程的新手。我只懂JS。

通过golang教程中的简单示例。我发现添加a1 + a2会提供负整数值?

var a1 int16 = 127
var a2 int16 = 32767

var rr int16 = a1 + a2

fmt.Println(rr)

结果:

-32642

例外:

  1. 编译器会在超出int16 max时抛出错误。
  2. (OR)GO自动将int16转换为int32。
  3. 32894
  4. 你们能解释为什么它显示-32642。

3 个答案:

答案 0 :(得分:5)

这是Integer Overflow在规范中定义的行为的结果。

您没有看到预期的结果,因为

  1. 溢出在运行时发生,而不是编译时。
  2. Go是静态类型的。
  3. 32,894大于int16可表示的最大值。

答案 1 :(得分:4)

这很简单。 16位整数将正部分I 0 - 32767(0x00000x7FFF)和负部分从0x8000( - 32768)映射到0xFFFF( - 1)。

例如0 - 1 = -1,它存储为0xFFFF

现在在您的具体案例中:32767 + 127。

您溢出是因为32767是带符号的16位整数的最大值,但是,如果您强制添加0x7FFF + 7F = 807E并将807E转换为签名16位整数,你得到-32642。

您可以在此处更好地理解:Signed number representations

答案 2 :(得分:0)

另外,请检查这些Math Constants

const (
    MaxInt8   = 1<<7 - 1
    MinInt8   = -1 << 7
    MaxInt16  = 1<<15 - 1
    MinInt16  = -1 << 15
    MaxInt32  = 1<<31 - 1
    MinInt32  = -1 << 31
    MaxInt64  = 1<<63 - 1
    MinInt64  = -1 << 63
    MaxUint8  = 1<<8 - 1
    MaxUint16 = 1<<16 - 1
    MaxUint32 = 1<<32 - 1
    MaxUint64 = 1<<64 - 1
)

And check the human version of these values here