int main() {
unsigned i = 5;
int j = -10;
double d = i + j;
long l = i + j;
int k = i + j;
std::cout << d << "\n"; //4.29497e+09
std::cout << l << "\n"; //4294967291
std::cout << k << "\n"; //-5
std::cout << i + j << "\n"; //4294967291
}
我相信 signed int
在执行算术运算符之前被提升为 unsigned
。
当 -10
转换为无符号 unsigned integer underflow
(这是正确的术语吗??)时会发生,加法后会打印 4294967291
.
为什么打印 -5
的 int k
没有发生这种情况?
最佳答案
执行算术运算符的过程涉及使两个值具有相同类型的转换。此过程的名称是查找常见类型,对于 int
的情况和 unsigned int
,转换称为 usual arithmetic conversions .术语promotion在这种特殊情况下不使用。
在i + j
的情况下, int
转换为 unsigned int
, 通过添加 UINT_MAX + 1
给它。所以 i + j
的结果是UINT_MAX - 4
,在您的系统上是 4294967291
.
然后将这个值存储在各种数据类型中;唯一需要进一步解释的输出是 k
.值UINT_MAX - 4
无法放入 int
.这称为超出范围的赋值,结果值是实现定义的。在您的系统上,它显然分配了 int
与 unsigned int
具有相同表示的值值(value)。
关于c++ - C++中的无符号整数提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42200610/