Int32与Int64按位左移32位结果不同的原因及相关教程咨询
差异原因解答
这一运行结果差异是C#语言规范中移位运算的类型适配规则、以及运算符优先级共同决定的,具体拆解如下:
优先级说明
C#中左移运算符<<的优先级高于按位与运算符&,因此两段代码都是先执行左移运算,再执行按位与运算,不存在运算顺序的差异。
移位运算的类型规则
C#针对不同位宽的整数类型,对移位计数的处理逻辑不同:
- 32位整数(
int/uint,对应Int32):移位计数仅取二进制低5位,等价于实际移位位数 = 输入的移位数值 模32。也就是说移位超过31位时,只有低5位有效,比如写<<32就等价于<<0,相当于没有移位。 - 64位整数(
long/ulong,对应Int64):移位计数仅取二进制低6位,等价于实际移位位数 = 输入的移位数值 模64。移位不超过63位时都会正常执行,<<32属于有效移位。
两段代码的运行过程
test1 运算过程
var test1 = 1 & Int64.Parse("1") << 32; // 结果为0
Int64.Parse("1")返回64位整数1- 左移32位后得到值为
4294967296(二进制最高位的1在第33位) - 与
1(二进制1在第1位)做按位与,没有重叠的有效位,结果为0
test2 运算过程
var test2 = 1 & Int32.Parse("1") << 32; // 结果为1,不符合预期的0
Int32.Parse("1")返回32位整数1- 左移32位时,实际移位位数为
32 % 32 = 0,移位后数值仍为1 - 与
1做按位与,结果为1
内容的提问来源于stack exchange,提问作者Cong HS
相关产品推荐
相关产品推荐

