gcc(TDM-GCC)中的无符号整数溢出错误?

时间:2014-09-02 23:41:15

标签: c++ gcc integer-overflow

#include <iostream>
#include <climits>
#include <cinttypes>
using namespace std;

int main()
{
    uint16_t i = 0;
    cout << USHRT_MAX << '\n' << i - 1 << '\n';
    return 0;
}

输出

65535
-1

我期待两个相同的输出,但它不是。这不是一种不符合标准的行为吗?

*系统:Windows7

*编译选项:g ++ -o $(FileNameNoExt)$(FileName)-std = c ++ 11 -Wall -Wextra

2 个答案:

答案 0 :(得分:2)

当C ++看到表达式

i - 1

它会自动提升i和1到int类型,因此表达式的结果为int,因此输出为-1。

要解决此问题,请将表达式的整体结果强制转换为uint16_t,或执行类似

的操作
i--;

就地修改i,然后打印i

希望这有帮助!

答案 1 :(得分:2)

ii - 1的评估>之前被提升为,因此表达式i - 1本身被评估为有符号整数({{1} }),尝试:

int

Live Demo