无法理解C中的unsigned int类型

时间:2012-08-10 13:47:15

标签: c types int unsigned-integer

我开始用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,因为结果是否定的。无论如何,有人可以帮助我吗?

7 个答案:

答案 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)

您没有收到错误,因为编译器无法知道您将来会做什么。