我开始用C语言编程,我遇到了一些问题,无法理解我得到的一些结果。我会在这里粘贴代码:
#include <stdio.h>
unsigned int main(void)
{
unsigned int x = 0;
printf("%u\n",x-1);
return 0;
}
终端返回4.294.967.295,我不明白为什么。我知道这个值是unsigned int
的最大值,但实际上我期待编译器发出一些警告,我必须使用int
类型而不是unsigned int
,因为结果是否定的。无论如何,有人可以帮助我吗?
答案 0 :(得分:3)
使用无符号类型时,所有位都用于表示非负值(即&gt; = 0)。可以把它想象成值环绕,所以当你减少到下限(0)以下时,你会回绕到最大值(32位,2 ^ 32 - 1)。
另外,请注意,您没有为变量x
分配负值,您只提供了一个从中减去1的表达式。即,
x-1
VS
x = x - 1;
虽然你是否会对此发出警告可能取决于编译器和设置的警告级别。
答案 1 :(得分:1)
这是固定的位数(32)和two's complement,可以帮助你。
答案 2 :(得分:1)
unsigned int
因为它的名字暗示没有任何迹象。
unsigned int
值表示为32位值,因此当您减去一个值时,它会从0x00000000翻转到0xFFFFFFFF,这样就可以获得4294967295。
答案 3 :(得分:1)
C标准表示所有无符号算术都发生在模2 ^ N范围内,其中N是类型中的位数。因此,在无符号算术中从0减去1不会导致-1,而是在UINT_MAX中。
将无符号值视为环,其中0粘在UINT_whatever旁边。无论你是在增加,减少,转移,倍增,甚至否定,你都永远不会离开戒指。所以你完全可以做像
这样的事情 unsigned int x = -1; /* Assigns UINT_MAX. */
答案 4 :(得分:0)
无符号表示您只有正值。计算机将数字存储为二进制数据。当你做0 - 1时你得到最大的int值。您可以在此处阅读更多相关信息:http://en.wikipedia.org/wiki/Signed_number_representations
答案 5 :(得分:0)
因为unsigned int
无法存储负整数。
请阅读有关补码和二数复数的信息。
最高位与其他位置一起被设置,然后被解释为正数。
答案 6 :(得分:0)
您没有收到错误,因为编译器无法知道您将来会做什么。