首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于字符(char)的有关问题:难道字符不是8位(8 bits)

2012-02-23 
关于字符(char)的问题:难道字符不是8位(8 bits)?关于字符(char)的问题:难道字符不是8位(8 bits)?最近正好

关于字符(char)的问题:难道字符不是8位(8 bits)?
关于字符(char)的问题:难道字符不是8位(8 bits)?

最近正好针对字符得编程做得多一些。发现了一个问题,在Visual C++和C++ Builder 平台都存在的问题。
编译环境:缺省设置。
根据MSDN的解释,在C++中,char 是一个字节(8bits),unsigned char 也是一个字节(8bits)。两者具有共同的数据范围:0x00到0xFF,如果用它们表示整数的话,范围分别就是-128到127,0到255;但用16进制表示都是一样的:即00到FF。

但是在输出时,发生了奇怪的现象:

代码:
......
char x = 0x80;
CString str;//CString 是MFC定义的字符串类。
str.Format("%X",x);
......
结果:
str显示为32bit的数:FFFFFF80,显然,与MSDN的描述矛盾了。MSDN说是8bits,结果却是32bits!!!
如果,给x赋的值小于等于0x7F,那么str的内容只有8bits,与MSDN的描述一致。
又如果把上面的变量x声明为unsigned char ,则不论给x赋何值,str的内容永远都是8bits,与MSDN的描述一致。

上面的问题在C++ Builder平台也是如此。

[解决办法]
32位系统上%x默认是按照32位数来处理的,也就是一般的int32,在计算机内部,负数是用补码表示的,char是有符号的数,但char的最高位为1时,是负数,转换为int32是也是负数,所以但char是0x80是,最高位为负数,转换为int32后为FFFFFF80,但unsigned char为非负数,不存在补码的表示,也转换为 unsigned int32,值为00000080,但%x默认不打起面的0的,所以为显示为0x80, 但char为0x7F是,最高位为0,是非负数,转换为int32后为0x0000007F,所以打印出也为0x7F

热点排行