C++ 理解有符号与无符号比较
有人能告诉我为什么if条件是假的吗C++ 理解有符号与无符号比较,c++,underflow,C++,Underflow,有人能告诉我为什么if条件是假的吗 #include <iostream> using namespace std; int main(int argc, char *argv[]) { int a; unsigned int ua; a = -1; ua = a; cout << "ua: " << ua << endl; if (ua != -1) cout <<
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int a;
unsigned int ua;
a = -1;
ua = a;
cout << "ua: " << ua << endl;
if (ua != -1)
cout << "Is unsigned" << endl;
else
cout << "Is signed" << endl;
return 0;
}
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
INTA;
无符号整数;
a=-1;
ua=a;
算术类型上的cout!=
和=
对其操作数执行通常的算术转换。与此相关的是,给定一个无符号X
类型的操作数和一个有符号X类型的操作数,X
是int
、long
和long
中的一个,通常的算术转换将有符号操作数转换为无符号类型,然后再进行比较
因此,当您比较
ua
(类型无符号int
)和-1
(类型有符号int
)时,-1
被转换为类型无符号int
(概念上,通过向其添加232,假设为32位int
)这一结果与-1
转换为无符号整数。这将在第5节
第10段中介绍,该段最后说:
否则,如果具有无符号整数类型的操作数具有秩
大于或等于其他操作数类型的秩,
带符号整数类型的操作数应转换为
无符号整数类型的操作数
<代码> -1 被转换为<代码>未签名的INT/CUT>。如果-- 1转换为未签名int,它如何保持-1?我是指,-1被签署:S代码> -1 < /C>使用两个补码算法转换,导致<代码> UTINGMAX < /代码>。C++只是一个非常强的“趋势”。将所有的东西转换成无符号整数(当发生这种情况时的确切规则相当复杂;参见详细内容的C++标准)@harryPoker:没有。但是它再次被签名用于转换!太好了!现在我的心可以平静地休息了:)谢谢!现在我完全理解:)注意,引用的特定段落在C++14中发生了更改,但行为保持不变。相关的论文是。而且,
-1
到unsigned的转换不是完整的提升@T.C.C++14是一个更简单的引语…请参见积分促销部分5p10
中的否则,积分促销(4.5)应在两个操作数上执行
@ShafikYaghmour,如果您查看引用的部分,整数提升不适用于类型已为int
的操作数。在应用整数提升(如果有)后,将转换为无符号
。