请问 4294967295 << 32
为何还是 4294967295
而不是 0
?
4294967295 的二进制是 32 个 1:11111111111111111111111111111111
左移 31 位,4294967295 << 31
,结果是 10000000000000000000000000000000
,这个没问题。
但左移 32 位后,结果还是 4294967295(即二进制的 32 个 1)。
使用 ((uint)4294967295) << 32
依然如此。
请问这是什么原理?
左移运算符的操作数必须是整数类型(sbyte、byte、short、ushort、int、uint、long、ulong、char或枚举类型)。如果左移运算符的左操作数是整数类型,则只使用其低 5 位(int 和 uint 类型则使用其低 6 位)作为位移量。也就是说,左移 32 位等于左移 0 位,因为位移量超出了掩码(5 或 6),只保留其低位。因此,当你对 4294967295 左移 32 位时,实际上相当于左移 0 位,保留原值。因此再次得到的结果仍然是 4294967295,即 32 个二进制的 1。