c++ - 32 位和 64 位无符号整数的移位

标签 c++

我对这段代码有疑问:

uint32_t c = 1 << 31;
uint64_t d = 1 << 31;
cout << "c: " << std::bitset<64>(c) << endl;
cout << "d: " << std::bitset<64>(d) << endl;
cout << (c == d ? "equal" : "not equal") << endl;

结果是:

c: 0000000000000000000000000000000010000000000000000000000000000000
d: 1111111111111111111111111111111110000000000000000000000000000000
not equal

是的,我知道“d”的解决方案是使用“1ULL”。但是我不明白为什么当移位是 31 位时会发生这种情况。我在某处读到,移动 size-1 位是安全的,所以如果我写的指令没有“UUL”,而文字“1”的长度是 32 位,那么将它移动 31 位应该是安全的,对吗? 我在这里缺少什么?

问候

YotKay

最佳答案

问题在于您左移的表达式,即常量 1,被视为有符号整数。这就是为什么编译器在将结果分配给 d 之前对其执行符号扩展,从而导致您看到的结果。

将后缀 U 添加到 1 将解决问题 ( demo )。

uint64_t d = 1U << 31;

关于c++ - 32 位和 64 位无符号整数的移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663313/

相关文章:

c++ - 使用 boost::spirit::qi::symbols

c++ - 使用 clang 或 g++/gcc 打印预处理代码而不包括来自系统路径的文件

C++ - 使用 std::vector 和相关内存管理的正确方法

java - 使用正确的编码 jni 将 jcharArray 转换为 String

c++ - 从 C++ 程序刻录 CD/DVD

用于编译时字符串文字连接的宏的 C++ 替代方案

c++ - 在基类中编写工厂方法

c++ - 关于 unique_ptr 中原始指针的类型

c++ - 说明 C++ 最佳实践的小型且注释完整的项目

c++ - Vim 不高亮某些单词