从签名的字符到整数,过早促销的价值初始化
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
。
相关文章:
- 使用 cin.get() 初始化字符数组
- 当我们不使用空字符显式初始化字符数组时,字符串的长度是多少?
- 从 C++ 中的位表示形式初始化字符
- 初始化字符*
- 澄清了 strcpy() 在像这样初始化字符数组时的工作 *Arr.
- 使用 auto 关键字初始化字符数组
- make_unique值是否初始化字符数组
- 正在从常量初始化字符数组
- 在类构造函数中初始化字符矩阵
- 如何使用整数值中的数字符号初始化字符数组
- 如何初始化字符的 2D 数组
- 初始化字符数组 - C 和 C++
- 无法初始化C++字符
- 如何使用字符串(字符数组)初始化字符指针,而不是使用整数数组初始化 int 指针
- 是否可以使用有条件选择的字符串文本初始化字符数组
- 初始化字符时空字符的重要性
- 如何使用十六进制数初始化字符数组
- 断言错误,即使在使用 new 初始化字符指针后也是如此
- 如何在C++中使用字符串文字初始化字符的动态数组
- 有没有办法使用位初始化字符