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

char与unsined char的相关有关问题

2013-04-09 
char与unsined char的相关问题char str[4] {(char)0xE6, (char)0x88, (char)0x91, (char)0x00}printf(

char与unsined char的相关问题
char str[4] = {(char)0xE6, (char)0x88, (char)0x91, (char)0x00};
printf("%02x\n",str[0]);

上面这段代码,为什么输出会是:ffffffe6呢,
如果改成unsigned char str[4] = {(char)0xE6, (char)0x88, (char)0x91, (char)0x00};输出就是e6呢,很疑惑,我只是知道有符号和无符号表示的范围不同,但这个是怎么理解的 char?unsigned?char
[解决办法]
printf对参数会进行整数提升,signed char 类型的 0xE6 提升为int后为负数

printf("%02x\n",(unsigned char)str[0]);

就可以了
[解决办法]
char范围是-128~127.unsigned char 范围是0~255.而0xE6=230超过char的范围,打印输出时被转换为int输出了,unsigned char 正好可以存放下一个字节范围的值
[解决办法]
%x的表达范围一般是32位数的范围

str为char型数组时,str[0]实际上是负数,因此在printf函数中解析%x时,会将str[0]按带符号数扩展到32位,得到0xffffffe6,因此你用%02x打印出来就是ffffffe6.

而str为unsigned char 型数组时,str[0]是正数,因此在解析%x时,会将str[0]扩展到32位,得到0x000000e6, 因为你限制%02x,所以前导的6个0不会显示,只显示e6.

热点排行