繁体   English   中英

无法理解C中的unsigned int类型

[英]Can't understand unsigned int type in C

我开始用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)。 将其视为环绕的值,因此,当递减到下限(0)以下时,将环绕到最大值(32位,2 ^ 32-1)。

另外,请注意,您没有为变量x 分配负值,只是提供了一个从中减去1的表达式。

x-1

x = x - 1;

尽管您是否会收到警告,这可能取决于编译器和设置的警告级别。

固定位数(32)和二进制补码将您带到这里。

unsigned int ,顾名思义,没有符号。

unsigned int值表示为32位值,因此当您减去1时,它会从0x00000000滚动到0xFFFFFFFF,这将为您提供4294967295。

C标准说,所有无符号算术均发生在2 ^ N模的范围内,其中N是类型中的位数。 因此,在无符号算术中从0减去1将不会导致-1,而会导致UINT_MAX。

将无符号值视为一个环,在UINT_whatever旁边粘贴0。 不管您是要添加,减去,移位,乘以甚至取反,您都永远不会离开环。 因此,您完全可以做类似的事情

 unsigned int x = -1;    /* Assigns UINT_MAX. */ 

无符号表示您只有正值。 计算机根据一些规则将数字存储为二进制。 当您执行0-1时,将获得最大的int值。 您可以在此处阅读有关此内容的更多信息: http : //en.wikipedia.org/wiki/Signed_number_representations

因为unsigned int无法存储负整数。

请阅读有关补码和二进制复数的信息。

发生的情况是最高位与其他位一起被设置,然后被解释为正数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM