了解已签名与未签名的比较

时间:2014-08-27 02:31:48

标签: 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 << "Is unsigned" << endl;
    else
        cout << "Is signed" << endl;

    return 0;
}

我的意思是,这里ua == int_max_value,它不是-1,但是当我运行它时,输出是

  

已签名

2 个答案:

答案 0 :(得分:4)

算术类型的

!===在其操作数上执行所谓的通常的算术转换。与此相关,给定一个unsigned X类型的操作数和一个signed X类型的操作数,其中Xintlong和{{1}之一通常的算术转换在进行比较之前将带符号的操作数转换为无符号类型。

因此,当您比较long long(类型ua)和unsigned int(类型-1)时,signed int会转换为{{1}类型(概念上,通过向它添加2 32 ,假设32位-1),结果比较等于unsigned int的值。

答案 1 :(得分:1)

这是预期的行为,如果它们是算术类型,!=将对其操作数执行通常的算术转换。这在C ++标准草案5.10 Equality运算符草案中有所说明:

  

如果两个操作数都是算术或枚举类型,则通常   对两个操作数执行算术转换;每一个   如果指定的关系为真,则运算符应为真   如果是假的,则为false。

在这种情况下,这将导致整数提升,将-1转换为unsigned int。这一点将在5 10 中介绍,最后说:

  

否则,如果具有无符号整数类型的操作数具有等级   大于或等于另一个操作数类型的等级,   带有符号整数类型的操作数应转换为类型   带有无符号整数类型的操作数。