【问题标题】:Narrowing conversion from int to unsigned char缩小从 int 到 unsigned char 的转换
【发布时间】:2026-01-05 08:35:01
【问题描述】:

当我尝试编译这段代码时

struct T
{
    unsigned char x;
};

int main()
{
    unsigned char a = 10;
    unsigned char b = 1;

    T t = {a + b};

    return 0;
}

我得到这个错误:

错误:将 '(((int)a) + ((int)b))' 从 'int' 缩小到 {}内的'unsigned char' [-Wnarrowing]|

谁能解释一下为什么?

【问题讨论】:

标签: c++ char int narrowing


【解决方案1】:

您的加法表达式的操作数正在经历integral promotion

特别是,算术运算符不接受小于 int 的类型作为参数,并且在左值到右值转换后自动应用整数提升(如果适用)。这种转换始终保留价值。

您的ab 正在升级为intunsigned int,添加后又转换回unsigned char

如果转换是预期的程序行为(从您作为设计者的角度来看),您可以将其显式转换为您想要的类型。显式转换不是缩小转换。隐式转换是。因此,如果我们将隐式强制转换更改为显式强制转换,程序就不再是病态的了。

T t = { static_cast<unsigned char>(a + b) };

【讨论】:

  • 所以...我该如何解决这个问题?顺便说一句,我以前从未听说过这个
  • 如果你觉得可以接受,你可以set the error to a warning或者直接投T t = { (unsigned char)(a + b) };
  • 不确定,让我查一下。你用的是什么编译器?我的第一个猜测是明确的T t = { static_cast&lt;unsigned char&gt;(a + b) }; 可能会修复它,因为编译器不会认为你犯了错误。
  • 我使用的是 GCC 8.2.0
最近更新 更多