请问 4294967295 << 32 为何还是 4294967295 而不是 0?_(标签-ui|关键词-二进制)

该问题来自社区帖: https://bbs.csdn.net/topics/615204432.为符合问答规范, 该问题经过ChatGPT优化

请问 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。