a的类型是不带不符号,也就是说有一个变量为a的box中装入了一个数据,而printf中的%d又将a作为带符号数显示,在其他未明确指出时,a显示是一个不带符号数,而你使用了%d要求将a作为带符号数显示,那么显然显示的结果是-1,也就是说,如果a=95,printf("a=%c",a);则会显示成字符a呢!
65535二进制应该是全1或者说全F,-1在有符号数中表示就是全F
-1 的二进制表示最高位为1(符号位,为1表示负),最低位为1
内存表示是补码,即原码取反加1,取反符号位不变,就变成了最高位为1最低位为0中间全为1,再加上1,就全为1了
我说明白了吧
unsign int 的65535和,int型的-1,在内存中的,存储格式是一样的。你用%u,输出就是65535了。似乎,是用补码存储的。你可查相关资料,还没懂欢迎追问。
在16位的C编译器中,unsigned int a=65535;存储形式为16位全1。
而当它以16位有符号整数格式解读时,因为其最高位为1,于是按16位补码被解读为一个负数-1。