【发布时间】:2018-10-06 13:51:32
【问题描述】:
谁能解释 GCC-7 编译器的以下行为?
// main.cpp
#include <iostream>
using namespace std;
int main()
{
int a = -2147483648;
int b = -a;
cout << "a == " << dec << a << " == 0x" << hex << a << "\n";
cout << "b == " << dec << b << " == 0x" << hex << b << "\n";
if (a > 0)
cout << "a > 0 // ERROR\n";
else
cout << "a <= 0 // OK\n";
if (b > 0)
cout << "b > 0 // ERROR\n\n";
else
cout << "b <= 0 // OK\n\n";
int aa[] = { -2147483648, 0 };
int bb = -aa[0];
cout << "aa[0] == " << dec << aa[0] << " == 0x" << hex << aa[0] << "\n";
cout << "bb == " << dec << bb << " == 0x" << hex << bb << "\n";
if (aa[0] > 0)
cout << "aa[0] > 0 // ERROR\n";
else
cout << "aa[0] <= 0 // OK\n";
if (bb > 0)
cout << "bb > 0 // ERROR\n\n";
else
cout << "bb <= 0 // OK\n\n";
cin.get();
return 0;
}
不优化编译:g++ main.cpp
输出:
a == -2147483648 == 0x80000000
b == -2147483648 == 0x80000000
a <= 0 // OK
b <= 0 // OK
aa[0] == -2147483648 == 0x80000000
bb == -2147483648 == 0x80000000
aa[0] <= 0 // OK
bb <= 0 // OK
优化编译:g++ -O2 main.cpp
输出:
a == -2147483648 == 0x80000000
b == -2147483648 == 0x80000000
a <= 0 // OK
b <= 0 // OK
aa[0] == -2147483648 == 0x80000000
bb == -2147483648 == 0x80000000
aa[0] <= 0 // OK
bb > 0 // ERROR
这是未定义的行为还是编译器错误?
GCC 版本:gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
【问题讨论】:
-
附带说明,您不需要在以十六进制输出之前手动插入
<< "0x";<< std::showbase一劳永逸。
标签: c++