signed / unsigned int mismatch

时间:2012-06-03 14:50:47

标签: c++

以下程序给出了签名/未签名的不匹配警告:

#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

有两个赞美,没有像“符号和幅度方法”那样保留标志。如果没有符号位,为什么无符号整数能够存储更大的正数?混合有符号/无符号整数时可能出现的问题示例是什么?

5 个答案:

答案 0 :(得分:5)

  

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

a < b

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

此处表达式a < b与:

相同

2U < (unsigned int) -2与:

相同

2U < UINT_MAX - 1(在大多数两个补语系统中)1(真)。

  

有了两个赞美之词,就像“符号和幅度法”一样,没有为该符号保留位。

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

答案 1 :(得分:1)

2 147 483 648的代表是什么?

10000000 00000000 00000000 00000000

-2 147 483 648的代表是什么?

10000000 00000000 00000000 00000000

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

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

答案 2 :(得分:0)

int只能存储2 ^ 32个不同的值(如果它是32位),无论是signed还是unsigned。 因此,signed int的范围的1/2是零以下,并且该范围的1/2是零以上。 unsigned int的全范围大于零。

虽然他们没有调用signed int'符号位'的最高位,但可以这样对待。

答案 3 :(得分:0)

这不像(int)a&lt; INT(b)中???你是否需要强力进行显式类型转换?

答案 4 :(得分:-2)

嗯,-1作为signed int是-1而unsigned int是65534,所以问题在于带符号的值,其中需要“ - ”。如果返回-1错误代码,则使用unsigned int,即65534代码。