【问题标题】:Comparing -INT_MIN (GCC)比较 -INT_MIN (GCC)
【发布时间】: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

【问题讨论】:

  • 附带说明,您不需要在以十六进制输出之前手动插入&lt;&lt; "0x"&lt;&lt; std::showbase一劳永逸。

标签: c++


【解决方案1】:

这是未定义的行为。大概在您的机器上int 是32 位的,其范围是-21474836482147483647。试图否定-2147483648 会导致溢出(不是堆栈溢出:P),这是未定义的行为(定义了无符号溢出,但没有符号溢出。)因此编译器可以做任何它喜欢的事情。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多