#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为空间全部打印出来????