char类型数据向右移位时符号位问题
来源:互联网 发布:自助装修软件 编辑:程序博客网 时间:2024/04/28 21:35
首先运行环境是51单片机+KEIL C
最近写一个16进制数据转换成ASCII形式的函数,多次运行发现,当16进制数据高4位大于8时,转换就
出错。
最开始出错的程序如下:
在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.
找到这里知道程序错误的起因了,但hex & 0xf0处理的原因还不了解。
先断续调我的51程序。
这种地方 以后都要用unsigned char类型了,免得不必要的麻烦!
最近写一个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类型了,免得不必要的麻烦!
- char类型数据向右移位时符号位问题
- 按位向右移位运算符
- ARM下char类型符号问题
- Objective-C位运算符-向右移位运算符
- 关于char字符移位问题
- 关于char字符移位问题
- 位运算,有符号值, 算术移位
- 关于有符号数移位问题
- 符号位扩展问题
- 关于整型数据符号位扩展的问题
- 关于整型数据符号位扩展的问题 .
- 关于整型数据符号位扩展的问题
- 关于整型数据符号位扩展的问题
- MPU6050传感器数据符号位问题---被忽略的补码
- 关于整型数据符号位扩展的问题
- char类型的位操作
- 使用移位操作符实现无符号整数位反转
- 通过移位求绝对值或者加符号位
- el表达式 符号
- mfc wince 快捷键功能添加
- SaaS模式简介
- Spring in Action(摘抄)
- android 中使用socket使native和framework通信
- char类型数据向右移位时符号位问题
- MyEclipse 中加入SVN插间
- Oracle select ---------having条件过滤与where条件过滤
- windows 按键消息
- Jquery UI tabs(选项卡)插件和accordion(折叠菜单)插件的示例
- 第10章 PL/SQL基础知识
- 著名国画家金士焯
- 两行down掉你的linux
- 在ExtJS的ComboBox组件中实现下拉树效果