C语言无符号整形和无符号短整型显示负数结果为什么不一样?

unsigned int a=-12;
printf("a=%d\n",a);
结果是-12,但如果把a的类型换成unsigned short就是65524,为什么用int会是-22呢?
在VC++6.0和GCC中都是这样

因为printf里用%d来输出某个变量时,程序会默认该变量为int型。如果该变量是整型,但不是int,而是char或者short,程序会先把它转换成int型,再传给printf.
所以用unsigned int a=-12时,没有上面所说的转换步骤,%d当成有符号整数,输出是-12,没问题。
unsigned short a=-12时, 注意这时候a是16位,在内存中是11111111 11110100,转换成int型会变成32位,程序在它的左边会添加16个0,变成00000000 00000000 11111111 11110100,这时候符号位是0了,当然变成正数了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-23
顾名思义,无符号是没有符号的,只能保存非负数。所以显示结果是不一样的。

在计算机内部,负数与非负数没有区分,只是负数用补码形式储存,补码是原码按位取反再加1得到的。对于负数来说首位一定是1,假如作为正数,将是一个很大的数,也就变成了另一个数了。
第2个回答  2015-06-06
无符号整型和无符号短整型所占的字节数是不一样的
第3个回答  2011-11-04
你把它写成2进制就知道了!
相似回答