3

以下程序给出有符号/无符号不匹配警告:

#include <iostream>

int main()
{
unsigned int a = 2;
int b = -2;

if(a < b)
    std::cout << "a is less than b!";

return 0;
}

我试图理解混合有符号和无符号整数的问题。据我所知,int 通常使用二进制补码存储在内存中。

所以,假设我有数字 2。根据我的理解,它将在内存中表示如下:

00000000 00000000 00000000 00000010

并且 -2 将表示为一个人的恭维加 1,或者:

11111111 11111111 11111111 11111110

有了两个的恭维,就没有像“符号和大小方法”这样的符号保留。如果没有符号位,为什么无符号整数能够存储更大的正数?混合有符号/无符号整数时可能发生的问题的示例是什么?

4

5 回答 5

6

我试图理解混合有符号和无符号整数的问题。

a < b

通过通常的算术转换b转换为一个unsigned int,这是一个巨大的数字> a

这里的表达式与以下a < b内容相同:

2U < (unsigned int) -2这与:

2U < UINT_MAX - 1(在大多数二进制补码系统中)这是1(真的)。

有了两个的恭维,就没有像“符号和大小方法”这样的符号保留。

在二进制补码表示中,如果有符号数量的最高有效位是1,则该数字为负数。

于 2012-06-03T14:54:59.590 回答
1

2 147 483 648 的表示形式是什么?

10000000 00000000 00000000 00000000

-2 147 483 648 的表示形式是什么?

10000000 00000000 00000000 00000000

相同!因此,您需要一个约定来了解差异。惯例是第一位仍然用于决定符号,只是不使用您原本会使用的朴素符号幅度方法。这意味着每个正数都以 0 开头,实际数字只剩下 31 位。这给出了无符号数的正范围的一半。

您的代码的这个问题是有符号整数将被转换为无符号整数。例如,-1 将变为 4 294 967 295(它们具有相同的二进制表示),并且将比零大得多,而不是更小。这可能不是您所期望的。

于 2012-06-03T15:08:53.780 回答
0

这不是像 (int)a < int(b) 一样简单吗???C++ 是不是需要强烈地进行显式类型转换?

于 2012-06-04T18:35:15.943 回答
0

Anint只能存储 2^32 个不同的值(如果是 32 位),无论是signed还是unsigned. 所以 asigned int有 1/2 的范围低于零,而 1/2 的范围高于零。Anunsigned int具有高于零的整个范围。

虽然他们不将最高有效位signed int称为“符号位”,但可以这样处理。

于 2012-06-03T14:55:35.287 回答
-2

好吧,有符号整数的 -1 是 -1,无符号整数是 65534,所以问题在于需要“-”的有符号值。如果返回 -1 错误代码,则 unsigned int 将是 65534 代码。

于 2012-06-03T14:54:49.480 回答