从签名的字符到整数,过早促销的价值初始化

Value initialization from signed char to integer, premature promotion?

本文关键字:初始化 字符 整数      更新时间:2023-10-16

在此代码中:

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

char s和 short s在执行算术时将其促进到 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