左移在GCC中严重出错
Left shift goes heavily wrong with GCC
我已经看了这段代码一个小时了......我拼命地试图找到错误。
#include <iostream>
int main()
{
for (int32_t n = 1; n>= 0; n--)
{
std::cout << "n: " << n << std::endl;
std::cout << std::dec << " 64 - n: " << (64 - n) << std::endl;
std::cout << std::hex << " 0x1ULL << 64: " << (0x1ULL << 64) << std::endl;
std::cout << std::hex << " 0x1ULL << (64 - n): " << (0x1ULL << (64 - n)) << std::endl;
}
}
这就是输出:
n: 1
64 - n: 63
0x1ULL << 64: 0
0x1ULL << (64 - n): 8000000000000000
n: 0
64 - n: 64
0x1ULL << 64: 0
0x1ULL << (64 - n): 1
为什么 n = 0 时 (0x1ULL <<64) 与 (0x1ULL <<(64 - n)) 不同?n 的类型似乎无关紧要。
每个版本的 GCC 都是一样的。随意在线试用:http://www.compileonline.com/compile_cpp11_online.php
您有未定义的行为:
C++11 5.8/1 如果操作数正确,则行为未定义 为负数,或大于或等于提升的左操作数的长度(以位为单位)。
因此,假设long long
有 64 位,移位 64 位将产生未定义的行为。
左移计数应小于字体宽度。在本例中,int32_t 类型的宽度为 32 位,并且您正在移动超过其容量。这是不对的。
相关文章:
- 如何让 GCC/Clang 在保留标识符上出错
- 编译包含指向模板函数的指针的初始值设定项列表时,gcc 出错,但 clang 不出错
- 使用交叉工具ng编译gcc时出错
- 使用 TDM GCC 5.1.0 编译 PDCurses36 时出错
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 在Windows上使用GCC的链接时间优化构建wxWidgets DLL时出错
- 在科学 Linux 6 上安装 gcc 4.8 时出错
- 非常量引用类型的无效初始化中出错.在Linux操作系统中使用c++代码.GCC编译器
- 将std::vector作为模板模板参数传递时出错-在GCC中有效,在MSVC中失败
- 在 C++11 中使用 decltype() 时出错(在 gcc 4.7.0 中创建不透明的错误消息)
- 使用 GCC-4.8.1 在 MinGW 上编译 wxWidgets-2.8.12 时出错
- 在GCC中专门化静态类变量时出错:枚举示例
- 使用gcc 4.8.4/clang3.4编译Nana示例(Nana v1.1.2/1.1.3)时出错
- 在gcc中编译时出错
- 在ubuntu 11.10上安装GCC 4.3.4出错
- 在MinGW下使用GCC链接器时出错
- 在Vortex86DX上从头开始构建和编译GCC 5.2.0时出错
- 在编译GCC时出错部分模板专门化,而不是MSVC
- GCC 4.9 在检查内联函数的指针时出错(带 static_assert)
- vulkan-1.lib:添加符号时出错:GCC 中的文件格式错误