gpt4 book ai didi

c++ - 被未定义的 C++ 移位运算符行为和包装混淆 "pattern space"

转载 作者:太空狗 更新时间:2023-10-29 23:41:10 28 4
gpt4 key购买 nike

我对我在 article on undefined C++ behavior 的 Shift Operators 部分读到的内容感到困惑.

On the ARM architecture, the shift operators always behave as if they take place in a 256-bit pattern space, regardless of the operand size--that is, the pattern repeats, or "wraps around", only every 256 positions. Another way of thinking of this is that the pattern is shifted the specified number of positions modulo 256. Then, of course, the result contains just the least-significant bits of the pattern space.

表格特别奇怪:

Given a 32-bit integer with a value of 1:
+-----------------------------------+
| Shift left ARM x86 x64 |
+-----------------------------------+
| 32 0 1 1 |
| 48 0 32768 32768 |
| 64 0 1 1 |
+-----------------------------------+

这些价​​值观是什么,它们为何重要?

shift operators不要包裹。 根据 C++ 规范,如果将 32 位值左移 32,结果始终为 0。 (编辑:我错了,请查看答案!)那么这篇文章的目的是什么?什么是未定义的行为?

当我在 x86 上运行此代码时,我得到 0:

printf("%d", 1 << 32);

应该是this code snippet说明问题:

// C4293.cpp
// compile with: /c /W1
unsigned __int64 combine (unsigned lo, unsigned hi) {

return (hi << 32) | lo; // C4293

// try the following line instead
// return ( (unsigned __int64)hi << 32) | lo;
}

我希望返回值是 lo,因为程序员移走了所有 hi 位。警告很好,因为这可能是一个错误,但我没有看到任何未定义的行为......

最佳答案

如果您使用 x86 或 x64 机器指令来移位值,它们将屏蔽移位量并且仅使用低位进行实际移位。其他一些硬件可能不会这样做。

这就是它未定义的原因。

在您使用文字的示例中 1 << 32 ,很可能是编译器计算的值,这就是为什么它是 0 .在真正的 x86 硬件上尝试操作,你会得到 1 .

关于c++ - 被未定义的 C++ 移位运算符行为和包装混淆 "pattern space",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13087816/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com