独闷闷网

 找回密码
 立即注册
搜索
查看: 2208|回复: 0
打印 上一主题 下一主题
收起左侧

[原创] 如何将一个unsigned int类型变量拆分成两个字节变量?已解答。

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-28 13:31:47 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2015-1-28 14:50 编辑

玉林-玲珑:
如何将5678拆分成两个字节数据?  

鸿哥-深圳:
用移位赋值就可以了,我编一个程序给你看看。
  1. unsigned int a=5678;
  2. unsigned char H;
  3. unsinged char L;
  4. L=a;   //分解低8位
  5. H=a>>8;//分解高8位
复制代码

伟-肇庆:
把一个unsigned int 的变量拆分为两个字节的算法,如以下的代码
  1. unsigned int a=5678;

  2. L=a;   //分解低8位
  3. H=a>>8;//分解高8位
复制代码


我觉得还不是最高效的算法,想必,如果是初学者,看似最简单明了的编写可能是
  1. unsigned int a=5678;
  2. unsigned char H;
  3. unsinged char L;
  4. L=a;   //分解低8位
  5. H=a/256;//分解高8位
复制代码

我们以keil这个编译器为例子,大家都知道,单片机一般最为复杂的指令是乘除指令,如51,除了乘除指令,其他的都是单双周期的指令,而乘除指令是4个周期,而且是单个字节与单个字节的的乘除,多字节的乘除那就更为复杂,所以
一般我们用移位的思想代替乘除,想必鸿哥也是出于这方面的考虑,但移位,鸿哥移了8位,则要执行8次右移的运算,效率也不是很高。
其实最简单的,我用的算法是
  1. unsigned int a =0x1234;
  2. unsigned char H;
  3. unsigned char L;
  4. unsigned char* p=(unsigned char* )&a;
  5. H=*p++;
  6. L=*p;
复制代码


很简单,直接高效,内存COPY就行了,在keil中,H=0x12,L=0x34;
我这个算法,大家要注意编译器的大小端。小端从低位存储,大端从高位存储。keil是大端的。

朱兆祺-深圳:
这个算法要区分大小端,否则高低位会反调。大家多研究下我的C语音巨作《攻破C语言难点(连载)》

伟-肇庆:
是呀,我强调了大小端。朱老师最有发言权。

乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2024-11-30 03:46 , Processed in 0.176381 second(s), 18 queries .

快速回复 返回顶部 返回列表