预期溢出但添加两个字节不会

时间:2015-09-11 19:04:15

标签: c++ integer-overflow

更新

有人可以解释将uint8_t提升为int的原因吗?这种行为有什么用例?我可以阻止推广吗?

我有这些非常简单的代码片段,它们将两个整数类型组合在一起并打印结果。我已使用g++ --std=c++11 main.cpp -o test

编译了那些没有任何优化
int main()
{
    uint8_t a = 200, b = 100;
    uint16_t result = (a + b);

    printf("result is %d\n", result);
}

输出:

  

结果是300

我原本期望(a + b)评估为44因为它们都是8位类型并且应该溢出。但相反,我得到300的意外结果。

如果我使用uint32_tuint64_t重新运行相同的测试,则会按预期溢出:

int main()
{
    uint32_t a = UINT_MAX, b = UINT_MAX;
    uint64_t result = (a + b);

    printf("result is %ld\n", result);
}

输出:

  

结果是4294967294

现在我不知道为什么uint8_tuint32_t的处理方式不同。

2 个答案:

答案 0 :(得分:8)

小于int的整数类型在对它们执行操作时被提升为int

答案 1 :(得分:1)

C ++标准: 5.10

  

- 否则,应在两者上执行整体促销(4.5)   操作数。然后,以下规则适用于晋升   操作数:    - 如果两个操作数具有相同的类型,则不再进一步转换   需要。

4.5.1整体促销

  

除bool,char16_t,char32_t或之外的整数类型的prvalue   wchar_t,其整数转换等级(4.13)小于等级   如果int可以表示all,则int可以转换为int类型的prvalue   源类型的值;否则,源prvalue可以   转换为unsigned int类型的prvalue。

这很可能是原因:

3.9.1基本类型

  

普通in具有建筑物所建议的自然尺寸   执行环境;提供了其他有符号整数类型   满足特殊需求。