有人可以解释将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_t
和uint64_t
重新运行相同的测试,则会按预期溢出:
int main()
{
uint32_t a = UINT_MAX, b = UINT_MAX;
uint64_t result = (a + b);
printf("result is %ld\n", result);
}
输出:
结果是4294967294
现在我不知道为什么uint8_t
与uint32_t
的处理方式不同。
答案 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具有建筑物所建议的自然尺寸 执行环境;提供了其他有符号整数类型 满足特殊需求。