搜索
bottom↓
回复: 26

如何合并两个8位寄存器的值

[复制链接]

出0入0汤圆

发表于 2013-11-14 23:09:52 | 显示全部楼层 |阅读模式
把两个8位寄存器的值合并,int a,int b
a=a<<8+b; 这样可以吗

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-11-14 23:11:35 | 显示全部楼层
你这里的a跟b不是八位的吧- -
如果a,b都是低八位有效的话这样是可以的

出0入0汤圆

发表于 2013-11-14 23:20:18 | 显示全部楼层
好像<<的优先级没有+高,估计会悲剧。加个括号是好习惯。

出0入0汤圆

发表于 2013-11-14 23:22:00 | 显示全部楼层
http://baike.baidu.com/view/1516130.htm  补补C语言基础。

出0入0汤圆

 楼主| 发表于 2013-11-15 00:20:50 | 显示全部楼层
NEWT 发表于 2013-11-14 23:11
你这里的a跟b不是八位的吧- -
如果a,b都是低八位有效的话这样是可以的

应该怎么写呢

出0入0汤圆

发表于 2013-11-15 01:11:55 | 显示全部楼层
wingerchen 发表于 2013-11-14 23:20
好像

对对- -应该用|
位运算就跟位运算一起,多个+号有点不搭

出0入0汤圆

 楼主| 发表于 2013-11-15 01:37:18 | 显示全部楼层
大傻师 发表于 2013-11-15 01:11
对对- -应该用|
位运算就跟位运算一起,多个+号有点不搭

完整的写法应该是怎样的呢

出0入442汤圆

发表于 2013-11-15 07:34:44 | 显示全部楼层
大傻师 发表于 2013-11-15 01:11
对对- -应该用|
位运算就跟位运算一起,多个+号有点不搭

+如果没溢出的话没事,如果溢出了就杯具了。
而且,还有一个重要的问题,就是得搞清楚CPU是大端的还是小端的,以及长整型Int是编译器实现还是CPU字长大小。在大端上面8位字节应该是在字的高位。

出0入0汤圆

发表于 2013-11-15 07:43:50 | 显示全部楼层
wye11083 发表于 2013-11-15 07:34
+如果没溢出的话没事,如果溢出了就杯具了。
而且,还有一个重要的问题,就是得搞清楚CPU是大端的还是小 ...

这个问题明显与大小端无关。。。。

出0入0汤圆

发表于 2013-11-15 07:54:16 | 显示全部楼层
我一般这么写

uint16 F(uint8 a,uint8 b)
{
    union{
        uint8 u8[2];
        uint16 u16;
        }R;
    R.u8[0]=a;
    R.u8[1]=b;
    return R.u16
}

出0入0汤圆

发表于 2013-11-15 08:11:55 | 显示全部楼层
as9901 发表于 2013-11-15 07:54
我一般这么写

uint16 F(uint8 a,uint8 b)

这个可以有,我也这样用过,关键看你的ab的位数和有效位数。

出0入0汤圆

发表于 2013-11-15 08:35:27 | 显示全部楼层
8位的话就只能是a=a+b;

出0入0汤圆

发表于 2013-11-15 08:54:32 | 显示全部楼层
char a,b;
int c;
c=a<<8 + b;

出0入0汤圆

发表于 2013-11-15 08:59:59 | 显示全部楼层
加256不可以?

出0入131汤圆

发表于 2013-11-15 09:02:51 | 显示全部楼层
我一般这么写

a = ((uint16_t)a<<8) + b;

出0入21汤圆

发表于 2013-11-15 09:09:15 | 显示全部楼层
用联合数据类型

出0入4汤圆

发表于 2013-11-15 09:12:50 | 显示全部楼层
asj1989 发表于 2013-11-15 09:02
我一般这么写

a = ((uint16_t)a

这样写可以不用管是大端还是小端.
我一般也是这样写的,不差编译后多几行代码的.

出0入0汤圆

发表于 2013-11-15 11:53:13 | 显示全部楼层
你说的是两个普通变量还是51的特殊寄存器,如果是51的特殊寄存器,可以用sfr16定义16位寄存器,标准51里也有几个sfr16的寄存器,你可以参考下。
如果是普通变量,就按上面的做法吧。

出0入0汤圆

发表于 2013-11-15 13:39:57 | 显示全部楼层
本帖最后由 sunocean 于 2013-11-15 13:41 编辑

WORD a(BYTE low,BYTE high)
{
WORD result=0;
result=(high<<8)|low;
return result;
}

出0入0汤圆

发表于 2013-11-15 16:43:08 | 显示全部楼层
uint16_t func(int a, int b)
{
    return (a << 8) | b;
}
两个8位的变量合并后应该是16位长,
如果使用算数运算就是:
uint16_t c;
c = 256 * a + b;

出0入54汤圆

发表于 2013-11-15 17:17:29 | 显示全部楼层
unsigned int a,b;
a=((unsigned char) a<<8) | ((unsigned char) (b & 0x00ff));

出0入0汤圆

发表于 2013-11-15 21:14:03 | 显示全部楼层
char a,    char b ,     int c

c = (a << 8) + b;   // 合并

出0入0汤圆

发表于 2013-11-15 21:18:48 | 显示全部楼层
c = a;
c = (c << 8) + b;  //   这样比较好

出0入0汤圆

发表于 2013-11-15 22:21:59 | 显示全部楼层
int result;
union
{
     int a=0;
     char b[2]={0};
}c;
c.b[0]=reg1;
c.b[1]=reg2;
result=c.a;

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2013-11-15 22:39:55 | 显示全部楼层
int c, char a, char b;
c = a;
c <<= 8;
c += b;

出0入0汤圆

发表于 2013-11-15 22:46:55 | 显示全部楼层
lcofjp 发表于 2013-11-15 07:43
这个问题明显与大小端无关。。。。

+1
C已经把依赖CPU特性的东西封装好了. 除非强行用指针访问.

出0入0汤圆

发表于 2014-3-12 14:21:15 | 显示全部楼层
悬赏2莫元?这也太少了吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:12

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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