Go与C#左移运算结果差异原因及对齐方法
C#与Go左移运算结果不同的原因及对齐方法
差异原因
- 默认整数类型宽度不同:C#里
0x2555C6默认是32位有符号int,而Go在64位系统中0x2555C6默认是64位有符号int。 - 溢出处理逻辑不同:
- 先算基础值:
0x2555C6转十进制是2440646,左移16位等价于乘以65536,结果为160352829440。 - C#的32位int最大值是2147483647,这个结果远超上限,默认触发溢出截断,只保留低32位数值:
160352829440 % 2^32 = 1439039488,这就是C#的输出。 - Go的64位int能容纳完整结果,所以直接输出原始计算值。
- 先算基础值:
让Go输出与C#对齐的方法
需要模拟C#的32位int溢出行为,有两种可行方式:
方式1:强制转换为int32类型
gLeftShift := int32(0x2555C6 << 0x10) fmt.Println(gLeftShift)
方式2:手动对2^32取模
gLeftShift := 0x2555C6 << 0x10 fmt.Println(gLeftShift % (1 << 32))
两种方式的输出均为1439039488,与C#结果完全一致。
内容的提问来源于stack exchange,提问作者karel
相关产品推荐
相关产品推荐

