【问题标题】:Why does adding a constant to an int8_t promote it to a larger type?为什么向 int8_t 添加常量会将其提升为更大的类型?
【发布时间】:2014-04-26 23:01:43
【问题描述】:

在 gcc 中,对小于 int 的整数类型添加或减去常量会得到 int

#include <cstdint>
#include <cstdio>

int main()
{
    int8_t wat = 5;
    printf("%zd\n", 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]

有没有办法抑制这个警告?为什么会出现这种情况?强制转换似乎不起作用。

【问题讨论】:

  • Clang 在这种情况下不会发出警告...
  • 并非所有整数都是ints..
  • 不只是在 GCC 中。该标准将其定义为整体促销。

标签: c++ integer integer-promotion


【解决方案1】:

根据 C++ 标准

10 许多二元运算符需要算术或运算操作数 枚举类型导致转换并产生类似的结果类型 大大地。 目的是产生一个共同的类型,这也是 结果。这种模式称为通常的算术转换,

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

1 除 bool、char16_t、char32_t 或 wchar_t 其整数转换等级 (4.13) 小于 如果 int 可以表示所有,则 int 可以转换为 int 类型的纯右值 源类型的值;否则,源纯右值可以是 转换为 unsigned int 类型的纯右值。

所以在这个表达式中

wat += 5;

相当于

wat = wat + 5;

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

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

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2015-09-06
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多