c++ - shift -1 到 sizeof(int) 在 C++ 中生成两个不同的结果

标签 c++ bit-shift

<分区>

我正在编写一些代码并发现了这个问题。我很好奇为什么会这样。

代码如下:

int n = sizeof(int)*8;
int mask_two = (-1<<n);
cout<<"1:"<<hex<<mask_two<<endl;

int y = -1<<(sizeof(int)*8);
cout<<"2:"<<hex<<y<<endl;

当我编译这段代码时,输​​出是:

1:ffffffff
2:0

为什么输出#1 和输出#2 的值不同?编译是Visual C++ 10.0。这个问题的根本原因是什么?

最佳答案

首先,左移值会在 C++11 中产生未定义的行为,尽管 C++03(及之前的版本)没有明确说明这一点。

其次,不允许将任何 值移动其完整位宽或更多。这也是未定义的行为。而这正是您正在做的:您正在将一个 int 值移动 int 类型的位宽(假设 CHAR_BIT8 在您的平台上)。

您的示例中移位计数器的允许值范围从 0sizeof(int) * CHAR_BIT - 1。您正在冒险超出允许的范围。

结果的差异可能是由于第一个值是在运行时计算而第二个值是在编译时计算的。这些计算算法对您的输入的处理方式不同,这就是结果不同的原因。这没关系,因为无论如何行为都是未定义的。

关于c++ - shift -1 到 sizeof(int) 在 C++ 中生成两个不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26052061/

相关文章:

c++ - 什么是 0xFF,为什么要移位 24 次?

c - 这个 reverseBytes 方法是如何工作的?

c++ - 生成constexpr字符串表,不能产生常量表达式

c++ - std::deque::push_back/front 的复杂性要求

c++ - 上传图片、视频和 Zip 变成 "Unable to Preview"/"Invalid"

vhdl - 用 VHDL 设计组合移位运算符

c - 如何在没有 stdlib 的情况下将多个数字合并为一个数字,例如 4,0,0 合并为 400

c++ - 适用于 Linux(和 Windows)的异步 C++ 通信库

c++ - 如何为多线程客户端访问多个线程上的同一个套接字

Java循环和移位