在看一篇文章中,遇到一个关于C语言unsigned关键字的问题。

main()
{
unsigned i;
for(i = 9;i >= 0;i--)
{
printf("%u\n",i);
}
}
这是源代码。如果将unsigned换成int,问题十分简单,但是unsigned则有问题,那就是这个程序将会执行很久很久,数值是从unsigned的所允许的范围内德几乎是最大数开始执行。(详细的执行情况,大家可以编译一下)

我们用假设int只占1个字节,这样便于说明(原理是一样的)
那么int的取值范围就是0-127(二进制表示就是00000000-01111111)以及0-负127(二进制表示就是00000000-11111111)最前面的1表示负数,也就是说符号要占一位
如果是unsigned int,那么就没有符号位,也就是说不用考虑负数,那么取值就是0-255(二进制表示就是00000000-11111111),最前面的1现在不代表符号了
所以你代码里面,当i--执行以后,如果i=-1,他的二进制表示是11111111,也就是255
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-31
这是个死循环!
因为 无符号i 是永远不小于0 的。
当i等于0 时, i--是-1: 而无符号的-1就是无符号整型所能表达的最大整数。
第2个回答  2011-10-31
问题出在=号上,无符号数是大于等于0的,当i=0时,在执行下一次i--时,i的值变为unsigned范围的最大值,条件依然成立,所以形成无限循环,只有是有符号i才能小于0,结束循环。把0改为1也是正确的。你可以不用循环直接把i赋值为0,把i--的值打印出来就知道了。
第3个回答  2011-10-31
i是unsigned,当i = 0的时候满足你的循环条件,printf之后,i--,由于他是unsigned,此句执行之后,i = unsigned的最大值,以此不停的循环,即死循环
相似回答