C ++中的无符号整数提升
Integer promotion unsigned in c++
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. The term promotion 未使用在这种特殊情况下。
在 i + j
的情况下,通过向其添加 UINT_MAX + 1
将 int
转换为 unsigned int
。所以 i + j
的结果是 UINT_MAX - 4
,在你的系统上是 4294967291
.
然后您将这个值存储在各种数据类型中;唯一需要进一步解释的输出是 k
。值 UINT_MAX - 4
不适合 int
。这称为 out-of-range 赋值 ,结果值为 implementation-defined。在您的系统上,它显然分配了 int
值,该值与 unsigned int
值具有相同的表示形式。
j
将在添加之前转换 为unsigned int
,这发生在您所有的i + j
中。快速实验。
在int k = i + j
的情况下。与您和我的实施情况一样,i + j
产生:4294967291
。 4294967291
大于 std::numeric_limits<int>::max()
,行为将由实现定义。为什么不尝试将 4294967291
分配给 int
?
#include <iostream>
int main(){
int k = 4294967291;
std::cout << k << std::endl;
}
产生:
-5
如所见Here
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. The term promotion 未使用在这种特殊情况下。
在 i + j
的情况下,通过向其添加 UINT_MAX + 1
将 int
转换为 unsigned int
。所以 i + j
的结果是 UINT_MAX - 4
,在你的系统上是 4294967291
.
然后您将这个值存储在各种数据类型中;唯一需要进一步解释的输出是 k
。值 UINT_MAX - 4
不适合 int
。这称为 out-of-range 赋值 ,结果值为 implementation-defined。在您的系统上,它显然分配了 int
值,该值与 unsigned int
值具有相同的表示形式。
j
将在添加之前转换 为unsigned int
,这发生在您所有的i + j
中。快速实验。
在int k = i + j
的情况下。与您和我的实施情况一样,i + j
产生:4294967291
。 4294967291
大于 std::numeric_limits<int>::max()
,行为将由实现定义。为什么不尝试将 4294967291
分配给 int
?
#include <iostream>
int main(){
int k = 4294967291;
std::cout << k << std::endl;
}
产生:
-5
如所见Here