jianhong_wu 发表于 2015-1-28 13:31:47

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

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

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

鸿哥-深圳:
用移位赋值就可以了,我编一个程序给你看看。
unsigned int a=5678;
unsigned char H;
unsinged char L;
L=a;   //分解低8位
H=a>>8;//分解高8位
伟-肇庆:
把一个unsigned int 的变量拆分为两个字节的算法,如以下的代码
unsigned int a=5678;

L=a;   //分解低8位
H=a>>8;//分解高8位

我觉得还不是最高效的算法,想必,如果是初学者,看似最简单明了的编写可能是
unsigned int a=5678;
unsigned char H;
unsinged char L;
L=a;   //分解低8位
H=a/256;//分解高8位
我们以keil这个编译器为例子,大家都知道,单片机一般最为复杂的指令是乘除指令,如51,除了乘除指令,其他的都是单双周期的指令,而乘除指令是4个周期,而且是单个字节与单个字节的的乘除,多字节的乘除那就更为复杂,所以
一般我们用移位的思想代替乘除,想必鸿哥也是出于这方面的考虑,但移位,鸿哥移了8位,则要执行8次右移的运算,效率也不是很高。
其实最简单的,我用的算法是
unsigned int a =0x1234;
unsigned char H;
unsigned char L;
unsigned char* p=(unsigned char* )&a;
H=*p++;
L=*p;


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

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

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

页: [1]
查看完整版本: 如何将一个unsigned int类型变量拆分成两个字节变量?已解答。