计算机使用二进制补码来存储整数。例如,对于int32有符号整型,0xFFFFFFFF表示“-1”。根据这个理论,在C语言中编写将有符号整数初始化为-1的代码并不难;
int a = 0xffffffff;
printf("%d\n", a);
显然,结果是-1
。
然而,在Go语言中,相同的逻辑输出不同。
a := int(0xffffffff)
fmt.Printf("%d\n", c)
该代码片段打印出
4294967295
,这是 uint32 类型可容纳的最大数字。即使我在 fmt.Printf("%d\n", int(c))
中对 c
进行了显式转换,结果仍然相同。当对有符号整数执行一些位运算时,也会发生同样的问题,使有符号整数变成无符号整数。
那么,在这种情况下,Go 会发生什么?