从有符号字符到整数的值初始化,过早提升?

Value initialization from signed char to integer, premature promotion?

在这段代码中:

signed char v = -64;
int n = 4;
int x = v - '0' * (signed char)n;
std::cout << x << std::endl;

x应该是-5还是-261?在我的理解中,初始化表达式有 signed char 类型,类型转换应该在稍后发生,一旦初始化被计算出来。

所以,v - '0' * (signed char)n 应该等于 -5,因为这是 signed char 估值中 -261 的等效值。

然而,那段代码打印 -261.

chars 和 shorts 在做算术时提升为 int(signed char)n 转换没有帮助,因为结果立即提升到 int 以进行乘法运算。

这里是显式的隐式转换:

int x = (int)v - (int)'0' * (int)(signed char)n;

表达式 v - '0' * (signed char)n 分组为 v - ('0' * (signed char)n)

两个参数 '0' (signed char)n 在乘法之前都转换为 int 类型。你无法阻止它。

v 中减去该总数,这也被提升为 int

这会在具有 ASCII 编码的平台上产生 -261