【发布时间】:2018-06-30 13:34:07
【问题描述】:
我试图理解 C++ 中的隐式转换规则,并且我理解当两个主要类型之间存在一个操作时,“较低类型”会提升为“较高类型”,所以让我们说:
int a = 5;
float b = 0.5;
std::cout << a + b << "\n";
应该打印 5.5,因为 'a' 被提升为浮点类型。我也明白无符号类型是比有符号计数器部分“更高的类型”,所以:
int c = 5;
unsigned int d = 10;
std::cout << c - d << "\n";
打印 4294967291 因为 'c' 被提升为无符号整数,并且由于无符号类型在小于零时回绕,所以我们得到了那个大数字。
但是对于以下情况,我不明白为什么我得到 -105 而不是正数。
#include <iostream>
int main(void) {
unsigned char a = 150;
std::cout << static_cast<int>(a - static_cast<unsigned char>(255)) << "\n";
return 0;
}
我猜是这段代码:
a - static_cast<unsigned char>(255)
应该产生一个正数,所以最终的强制转换(到 int)不应该影响最终结果,对吧?
【问题讨论】:
-
您忘记了整数提升(所有小于
int的整数类型,包括 char,在我们到达您在开始时描述的规则之前都被提升为int发布) -
这是 C++。您应该删除
C标记。 -
你猜
a - static_cast<unsigned char>(255)是肯定的,但从不费心去测试它。你应该有。 -
@Mark Benningfield 已删除。
标签: c++ char unsigned type-promotion