因为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得到的。对于负数来说首位一定是1,假如作为正数,将是一个很大的数,也就变成了另一个数了。
无符号整型和无符号短整型所占的字节数是不一样的
你把它写成2进制就知道了!