关于在C语言中无符号整形存储负数问题

#include <stdio.h>
#include <stdint.h>
int main(void)
{
int a;
a = -1;

printf("%d\n", a);
printf("%u\n", a);
return 0
}
两次打印的结果第一个是按照有符号来打印,打印为-1,第二个是按照无符号来打印,打印为-1补码的形式。
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint32_t a;

a = -1;
printf("%d\n", a);
printf("%u\n", a);
return 0;
}
打印结果和上面一样。
从上面第二个程序可以看到无符号整形也可以存储负数,并且编译没有警告或报错,那么是不是可一这样解释:无论是定义的是有符号变量或者是无符号变量,其能不能完整的存储一个数,是不是看这个数有没有超过存储的位数?比如上面定义的都是32位的,只要存储的这个数不超过32位,就不会发生截断现象,在存储过程中也不区分正负,负数全部按补码形式存放,至于如何解释存储这个数是正还是负,是不是在打印时候有格式化输出的格式决定的?比如%d代表有符号,那么如果存储这个数的32位空间最高位为1,就会打印一个负数,%u代表无符号,直接将存储这个数的32为空间全部打印出来????

你的理解是对的。
最高位为1时,对于有符号来说,这个数是负数,而对于无符号数而言,由于最高位也是有效存储位,所以可以存储更大范围的数。
话再说回来,既然是无符号数,输出格式应该是"%u",而不是"%d",这样才能做到“表里如一”,“改头换面”只会乱了自己,这不是游戏,严谨是必须的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-25
恩,大概是这个意思
相似回答