为什么在int8_t中添加常量会将其提升为更大的类型

Why does adding a constant to an int8_t promote it to a larger type?

本文关键字:类型 int8 常量 添加 为什么      更新时间:2023-10-16

在gcc中,将常数与小于int的积分类型相加或相减会得到int

#include <cstdint>
#include <cstdio>
int main()
{
    int8_t wat = 5;
    printf("%zdn", sizeof(wat + 1));
    return 0;
}

给出4。我在将简单的+=语句与-Wconversion一起使用时注意到了这一点。设置警告标志后,

#include <cstdint>
int main()
{
    int8_t wat = 5;
    wat += 5;
    return 0;
}

给出

wat.cpp:7:6:警告:从"int"转换为"int8_t{aka signed char}"可能会更改其值[-Wconversion]

有什么方法可以抑制这个警告吗?为什么会发生这种情况?选角似乎没用。

根据C++标准

10许多期望算术或枚举类型导致类似中的转换和生成结果类型方式目的是生成一个通用类型,该类型也是结果。这种模式被称为通常的算术转换,

通常的算术转换包括积分提升

1布尔、char16_t、char32_t以外的整数类型的prvalue,或wchar_t,其整数转换秩(4.13)小于如果int可以表示所有源类型的值;否则,源prvalue可以是转换为无符号整数类型的prvalue。

所以在这个表达式中

wat += 5;

相当于

wat = wat + 5;

赋值右侧的wat转换为类型int,表达式wat + 5的类型为int。由于类型int的值范围大于类型int8_t的值范围,编译器会发出警告。

警告消息还显示了如何抑制警告:[-Wconversion]