%u为以无符号十进制输出。无符号整数能表示的数范围是0-65535,即对应的二进制数0-1111111111111111(16个1)。
int a=-2;a为有符号的整型,以1111111111111111(16个1)的二进制数存储。(-2二进制表示为10000000000000010,负数在计算机中用补码表示,即1111111111111110)。如果用%d输出a,则为-2,但是转换成无符号整数%u输出,1111111111111110(原来的有符号整数-1)被解释成1111111111111110(无符号整数65534),输出结果为65534
出现这种情况, 是用的16位编译器. int占2字节.
赋值int a=-2; 补码形式存储, 实际存储为0xFFFE
用%u输出, 会转为无符号数(unsigned int)
也就是输出0xFFFE为原码的正数值, 即65534
printf("%u",a)中u是unsigned int的意思,即无符号数,如果你输printf("%d",a)就会输出-2了。
int a = -2在内存里以补码形式表示就是65534,符号数是一种输出形式,无符号数是另一种输出形式。
整形2在计算机中16二进制表示为:0000 0000 0000 0010
所以-2用2的补码表示为:1111 1111 1111 1110
(最高位用0表示正数,用1表示负数,-2即为将2的最高位变为1,将剩余位数取反,结果数加1,具体参看补码的表示方法)
由于输出时采用%u限制格式,用无符号表示,而1111 1111 1111 1110即表示65534(=2^16-2)
(1 0000 0000 0000 0000=1111 1111 1111 1110+1+1)
补码知道不是什么东西