[英]signed/unsigned int mismatch
以下程序给出有符号/无符号不匹配警告:
#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
有了二的恭维,就没有像“符号和幅度方法”那样为符号保留任何位。 如果没有符号位,为什么没有符号的int能够存储更大的正数? 混合有符号/无符号整数时可能出现的问题的例子是什么?
我试图了解混合有符号和无符号整数的问题。
a < b
通过通常的算术转换, b
会转换为unsigned int
,这是一个很大的数字> a
。
这里的表达式a < b
与以下内容相同:
2U < (unsigned int) -2
,与:
2U < UINT_MAX - 1
(在大多数的二进制补码系统中)为1
(真)。
有了二的恭维,就没有像“符号和幅度方法”那样为符号保留任何位。
在二进制补码表示形式中,如果有符号数量的最高有效位为1
,则该数字为负。
2 147 483 648的表示形式是什么?
10000000 00000000 00000000 00000000
-2 147 483 648的表示形式是什么?
10000000 00000000 00000000 00000000
相同! 因此,您需要约定以了解不同之处。 习惯上,第一位仍用于确定符号,只是不使用否则会使用的朴素符号幅度方法。 这意味着每个正数都以0开头,而实际数只剩下31位。 这给出了无符号数字正数范围的一半。
您的代码的问题是有符号整数将被转换为无符号。 例如,-1将变为4294967295(它们具有相同的二进制表示形式),并且将比零大很多,而不是小一点。 这可能不是您所期望的。
一个int
只能存储2 ^ 32个不同的值(如果是32bit),无论它是有signed
还是unsigned
。 因此,有signed int
的范围是零以下的1/2,范围是零以上的1/2。 unsigned int
完整范围大于零。
尽管他们没有将有signed int
的最高有效位称为“符号位”,但可以通过这种方式进行处理。
这不像(int)a <int(b)一样容易吗??? 像您那样的C ++是否需要强烈进行显式类型转换?
好吧,-1的有符号int是-1,而无符号int是65534,所以问题出在有符号值的地方,其中需要“-”。 如果返回-1错误代码,则unsigned int将为65534代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.