在使用 GCC 的 Linux 上,1UL<<44
是 0x100000000000
但是在使用 MSVC 的 Windows 上,1UL<<44
是 0
我很困惑。
这是否表明在 Windows 上左移不能移动超过 32 位?
最佳答案
在 Windows 中 unsigned long
s 是 32 位宽。这是由于不幸的 API 总是期望无符号长整型与 32 位(4 字节)同义,而在 Unixen 中,无符号长整型同样经常被错误地假定为具有适合存储指针的大小。因此,在 Unixen 中,使用 64 位无符号长整数是有意义的,而在 Windows 中,别无选择,只能保留它们 32 位。
当然,使用 uint32_t
总是正确的。和uintptr_t
分别针对这些,但在标准化之前编写了大量代码。
请注意,标准规定,如果移位量为负数,或者大于或等于移位类型的宽度,则在 Windows 上 1UL << 32
有未定义的行为。这是因为如果发生宽移位,有些硬件会将目标归零,有些硬件会中止,有些硬件只考虑模 32 的移位,即在本例中执行 1UL << 0
这当然等于 1。因此,由于此操作在任何可移植程序中都没有意义,一些 C 编译器可以愉快地假设它们永远不会发生。
关于c - msvc中的按位运算符左移与linux gcc不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212719/