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类型了,免得不必要的麻烦!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值