从有符号字符到整数的值初始化,过早提升?
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
.
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
。
在这段代码中:
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
。