首先有一个规定:用printf输出char类型的数据时,输出的结果取决于控制符是%d或%u,
对了,char不仅是字符型变量,还是整型变量。
%d是有符号的整形数据,%u是无符号的整形数据(就是纯二进制数)。
如下图:
这是用%d输出的时候,那么之前提到过unsigned表示纯二进制,-1的计算机数【二进制】为全一,所以数值上为255.而signed就是有补码的那套规则,所以输出了-1.
这是用%u输出时,可以看到含有补码规则的signed变成了2^32,即int的最大二进制值。现在再解释为什们两种数据为什们不一样。
我们知道,int有32为的二进制数【4个8】,char只有8位二进制数,差了24位,从char提升到int时,前面是要增加数字的,那么对signed来说,它【-1是11111111】补上符号位,即最高位的数字,补了24个1,对unsigned来说它就全补0,运算得到255.