【问题标题】:bitwise operation left shift in msvc is diffrent from linux gcc?msvc中的按位运算符左移与linux gcc不同?
【发布时间】:2019-12-04 08:47:55
【问题描述】:

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

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

我很困惑。

这是否表明在 Windows 上左移不能移动超过 32 位?

【问题讨论】:

  • 在 Windows 上 unsigned long 有 4 个字节,在 32/64 位模式下。也许试试1ULL << 44。在this site 上,您可以检查long 范围。
  • 类型 longunsigned long 不保证大于 32 位。显然在 Windows 下它们 32 位,所以是的,这限制了您可以将它们向左移动的程度。另一方面,看起来你的 Linux 机器正在实现更长的 long 类型,可以操纵 44 位值,例如 0x100000000000。
  • @rafix07 非常感谢,ULL 解决了这个问题

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


【解决方案1】:

在 Windows 中,unsigned longs 为 32 位宽。这是因为不幸的 API 总是期望 unsigned long 与 32 位(4 字节)同义,而在 Unixen 中,具有 unsigned long 的同样错误地经常被认为具有适合存储指针的大小。因此,在 Unixen 中使用 64 位无符号长整数是有意义的,而在 Windows 中,别无选择,只能保持 32 位。

当然,对它们分别使用uint32_tuintptr_t 总是正确的,但是在标准化之前编写了很多代码。


请注意,标准规定如果移位量为负数,或大于 或等于 移位类型的宽度,则行为未定义,因此 Windows 1UL << 32 具有未定义的行为。这是因为如果发生大位移,有硬件将目标归零,硬件中止和硬件只考虑位移模 32,即在这种情况下执行1UL << 0,当然等于 1。所以因为这个操作没有意义在任何可移植程序中,一些 C 编译器可以愉快地假设它们永远不会发生。

【讨论】:

  • M.m O_o errno == ENOCOFFE
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多