c - msvc中的按位运算符左移与linux gcc不同?

标签 c windows visual-studio visual-c++ bitwise-operators

在使用 GCC 的 Linux 上,1UL<<440x100000000000

但是在使用 MSVC 的 Windows 上,1UL<<440

我很困惑。

这是否表明在 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/

相关文章:

c# - Unity 5.2.2 将 Visual Studio 改回 MonoDevelop

c++ - 如何强制 Visual Studio 使用 wmain 而不是 main

c - 将 char 指针传递给函数的替代方法

c++ - float 大小是否取决于操作系统?

c++ - 从 .cur 格式字节创建游标?

java - FTPClient - 550 权限被拒绝

c# - .NET SystemInformation.PrimaryMonitorMaximizedWindowSize 显示大于 PrimaryMonitorSize

c++ - 默认模板参数的 "Redefinition"

c - 运行程序的多个输入

c - 我如何继续计算此函数 (f3) 的时间复杂度?