C++ 理解有符号与无符号比较

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 <<

有人能告诉我为什么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 << "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
)这一结果与 UA值的值进行比较。

< P>这是预期的行为,!> = /Cuth>如果它们是算术类型,将对其操作数执行通常的算术转换。这在草案C++标准部分<代码> 5.10 < /代码>相等的运算符中表示:

如果两个操作数都是算术或枚举类型,则通常 对两个操作数执行算术转换;每个 如果指定的关系为true,则运算符应产生true,并且 如果它是假的,那么它就是假的

在这种情况下,这将导致整数升级,将看到
-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
的操作数。在应用整数提升(如果有)后,将转换为
无符号