问:

为什么char a=0xff的打印结果是-1?

答:
这是因为char类型在C/C++中是有符号的,可以表示从-128到127的值。
0xff是一个16进制数,它的值是255。但是由于char类型只有8个二进制位,它无法直接表示255这个值。
当我们把一个大于127的数赋值给char时,会发生溢出。C/C++会使用二进制补码来表示这个值。
255的二进制是11111111,在补码方式下表示成:
1111 1111 -> 1000 0001
也就是-1。
所以当我们打印char a = 0xff时,会打印-1,这是因为a里实际存储的值是-1,这是255在char类型下的二进制补码表示。
总结一下:
1. char类型是有符号的,范围是-128到127
2. 0xff的值是255,超出了char的范围
3. 超出范围的值会使用二进制补码存储,255的补码是-1
4. 所以char a = 0xff;打印出来的是-1
这也从侧面说明了在C/C++中,小心使用char类型,如果要表示无符号的8位值,应使用unsigned char。
希望这个详细的解释可以帮助您理解char类型和二进制补码在这里的作用。如果有任何其他疑问,欢迎提出。