[英]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.