我是golang的新手,实际上,我是基于类型编程的新手。我只懂JS。
通过golang教程中的简单示例。我发现添加a1 + a2会提供负整数值?
var a1 int16 = 127
var a2 int16 = 32767
var rr int16 = a1 + a2
fmt.Println(rr)
结果:
-32642
例外:
你们能解释为什么它显示-32642。
答案 0 :(得分:5)
答案 1 :(得分:4)
这很简单。
16位整数将正部分I 0 - 32767(0x0000
,0x7FFF
)和负部分从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
)