C++ c+中无符号的整数提升+; intmain(){ 无符号i=5; int j=-10; 双d=i+j; 长l=i+j; int k=i+j; std::cout
执行算术运算符的过程涉及转换,以使两个值具有相同的类型。此过程的名称是查找公共类型,对于C++ c+中无符号的整数提升+; intmain(){ 无符号i=5; int j=-10; 双d=i+j; 长l=i+j; int k=i+j; std::cout,c++,unsigned-integer,C++,Unsigned Integer,执行算术运算符的过程涉及转换,以使两个值具有相同的类型。此过程的名称是查找公共类型,对于int和无符号int的情况,将调用转换。此术语不用于此特定情况 在i+j的情况下,int通过添加UINT_MAX+1转换为unsigned int。因此i+j的结果是UINT_MAX-4,在您的系统上是4294967291 然后将此值存储在各种数据类型中;唯一需要进一步解释的输出是k。值UINT\u MAX-4无法放入int。这称为超出范围赋值,结果值由实现定义。在您的系统上,它显然会赋值给int值,该值s与
int
和无符号int
的情况,将调用转换。此术语不用于此特定情况
在i+j
的情况下,int
通过添加UINT_MAX+1
转换为unsigned int
。因此i+j
的结果是UINT_MAX-4
,在您的系统上是4294967291
然后将此值存储在各种数据类型中;唯一需要进一步解释的输出是k
。值UINT\u MAX-4
无法放入int
。这称为超出范围赋值,结果值由实现定义。在您的系统上,它显然会赋值给int
值,该值s与无符号int
值的表示形式相同。j
将在添加之前转换为无符号int
,这在所有i+j
中都会发生。一个快速实验
在int k=i+j
的情况下,与您和我的实现一样,i+j
产生:4294967291
4294967291
大于std::numeric\u limits::max()
,行为将由实现定义。为什么不尝试将4294967291
分配给int
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
}
如所见
#include <iostream>
int main(){
int k = 4294967291;
std::cout << k << std::endl;
}
-5