char类型数据向右移位时符号位问题

来源:互联网 发布:自助装修软件 编辑:程序博客网 时间:2024/04/28 21:35
首先运行环境是51单片机+KEIL C
最近写一个16进制数据转换成ASCII形式的函数,多次运行发现,当16进制数据高4位大于8时,转换就


出错。
最开始出错的程序如下:
void hex2ascii(char hex, char ascii[]){char i = 0;ascii[0] = (hex & 0xf0) >> 4;ascii[1] = hex & 0x0f;sendNChar(ascii, 2);for (i=0; i<=1; i++){if (ascii[i] >= 0xa){ascii[i] = ascii[i] - 0xa + 'A';}else{ascii[i] = ascii[i] + '0';}}sendNChar(ascii, 2);}


在KEIL C51环境下,输入0xe3,输出fe 03 2e 33。
在VC环境下,输出输入0xe3,输出e 3 45 33
后来多次修改尝试,并分析原因。终于发现原因:hex是char类型,是有符号型,移位左边补符号位1。


故得fe,ascii[0]=0xfe是负数,小于0xa,故结果=0xfe+'0'=0x2e(溢出后结果)。


但不对,VC上运行正常呀,再分析
在VC上,int型占32位
按照C语言的自动类型转换原理
hex & 0xf0,分别是char和const int类型,转换成int型0xffffffe3 & 0x000000f0 = 0x000000e0


看来是,VC上运算移位时左边填充0,KEIL C51上运算移位时左边填充的是1.
int debug = 0;debug = hex & 0xf0;sendNChar(&debug, 2);


KEIL C51下输出ff e0

VC下输出e0


找到这里知道程序错误的起因了,但hex & 0xf0处理的原因还不了解。
先断续调我的51程序。
这种地方 以后都要用unsigned char类型了,免得不必要的麻烦!