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

首先运行环境是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类型了,免得不必要的麻烦!

你可能感兴趣的:(c,语言,hex)