C++中,0xFFFF转换成二进制为什么会溢出?

#include <stdio.h>
int main()
{
char x=0xFFFF;
printf("%d\n",x--);
}

这里面的0xFFFF转换为二进制为1111 1111 1111 1111,为什么会溢出??而取此二进制数的低八位为1111 1111??这个程序为什么在最后转换为整型的时候,要把这个char型x当做有符号型,从而取反+1而得出结果为-1??

char是字节型,只能取到低八位,于是得到1111 1111,机器里存储用的是补码,1111 1111b = -1
字节型的存储范围是0~127,二进制是00000000~01111111,最高位是符号位追问

哦,原来char型只能取到低八位。那为什么这个程序认定这个char是有符号型的呢(这个程序在TC2.01和Devc++环境下运行得出的结果都是-1)?为什么就不能是无符号型呢?这里char前面没有signed或者unsigned呀?然而得出的结果却是signed char的结果(为-1,而不是unsigned char 的结果255)?

追答

默认是signed类型,你定义为unsigned char x=0xFFFF;就输出255了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-02
char x=0xFFFF; // 这里给x 实际赋值是0xff
printf("%d\n",x--); // 这里输出的仍然是x 自减前的值,也就是0xff
你再输出一次
printf("%d\n",x);
才是你想要的结果,试试看吧追问

这样的话,X变为1111 1111(二进制数),但是在输出的时候为什么结果是有符号的(结果为-1),而不是无符号的(结果为255)呢?开始并没有在char 前面说明是singed或者是unsigned型呀。但是,这个程序在TC2.01和Devc++环境下运行得出的结果都是-1,把x当成了signed型数据,为什么不是unsigned型呢?

本回答被网友采纳
第2个回答  2012-09-01
0xFFFF=65535

prinf,格式化作为int型输出。
int型取值范围-32768~32767。