独闷闷网

标题: 如何将一个unsigned int类型变量拆分成两个字节变量?已解答。 [打印本页]

作者: jianhong_wu    时间: 2015-1-28 13:31
标题: 如何将一个unsigned int类型变量拆分成两个字节变量?已解答。
本帖最后由 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语言难点(连载)》

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






欢迎光临 独闷闷网 (http://dumenmen.com/) Powered by Discuz! X3.2