main(){
char x=0xFFFF;
printf("%d\n",x--);//为什么输出-1?
}
char 内存为1字节 最小值0,最大值255
char 0000 0000b ~ 1111 1111b
0xFFFF = 1111 1111 1111 1111b
0xFFFF赋值给char精度丢失结果就是11111111也就是最大值255,因为char最多只能装11111111b 也就是0xff
这里的255是无符号数也就是11111111没有符号位得出的。但是作为d输出那么d的概念是有符号位的
那么(1)1111111 第一位是符号位。1代表负数
因为是负数又因为数据存储为补码形式。转换成原码需要取反+1
111 1111取反就000 0000加1 就是000 0001
最后加上符号就是-1了
x++运算是编译决定的。实际是先使用x值,然后再让x自增。因此输出不影响原值
因为0xFFFF的整型显示就是-1,这与其补码有关。你的输出是%d也就是整型的。而x--代表先显示再减减
定义的x为0xFFFF中的0x表示16进制,因此0xFFFF表示为二进制位16个1
也就是-1的补码,而16个1第一位为1表示负数,也就是-1
所以输出的是-1,希望能解决你的问题,
0xFFFF 为无符号整型数,在赋值给 char 时先取其低字节,结果为 0xFF。也同样为无符号的字节数,最后赋值给 char 型变量为有符号的,需要经过无符号 到有符号的变换。
如果想要了解是转换的,需要看补码。如:原码, 反码, 补码 详解
main(){
char x=0xFFFF;
printf("%d\n",x--);//为什么输出-1?
}
代码以下代码等价
main(){
char x=0xFFFF;
printf("%d\n",x);//为什么输出-1?
x--
}
main(){
char x=0xFFFF;
printf("%d\n",x--);
}
这个跟你x的定义有关系,char是8位的,所以char x = 0xff,且是有符号的,0xff---->-1
在16位系统中,用0xFFFF表示的有符号数是-1;而char类型只有8位,在将0xFFFF赋值给x时,被截断为0xFF;所以完成赋值后的x实际值为0xFF,表示-1。在使用printf打印时,%d打印的整型是有符号的,打印出来的值为-1;x--表示打印出来后再自减1,在执行printf时打印出来的x是-1,这句执行完后x的真实值成-2了。
0XFFFF赋给char型,发生截断,所以这时候x是11111111,这个是补码,转化成原码就是10000001,这就是-1,然后printf("%d\n",x--),是先输出x,再对x进行--