cityfuture 发表于 2013-11-14 23:09:52

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

把两个8位寄存器的值合并,int a,int b
a=a<<8+b; 这样可以吗

NEWT 发表于 2013-11-14 23:11:35

你这里的a跟b不是八位的吧- -
如果a,b都是低八位有效的话这样是可以的

wingerchen 发表于 2013-11-14 23:20:18

好像<<的优先级没有+高,估计会悲剧。加个括号是好习惯。

wingerchen 发表于 2013-11-14 23:22:00

http://baike.baidu.com/view/1516130.htm补补C语言基础。

cityfuture 发表于 2013-11-15 00:20:50

NEWT 发表于 2013-11-14 23:11 static/image/common/back.gif
你这里的a跟b不是八位的吧- -
如果a,b都是低八位有效的话这样是可以的

应该怎么写呢

大傻师 发表于 2013-11-15 01:11:55

wingerchen 发表于 2013-11-14 23:20 static/image/common/back.gif
好像

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

cityfuture 发表于 2013-11-15 01:37:18

大傻师 发表于 2013-11-15 01:11 static/image/common/back.gif
对对- -应该用|
位运算就跟位运算一起,多个+号有点不搭

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

wye11083 发表于 2013-11-15 07:34:44

大傻师 发表于 2013-11-15 01:11 static/image/common/back.gif
对对- -应该用|
位运算就跟位运算一起,多个+号有点不搭

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

lcofjp 发表于 2013-11-15 07:43:50

wye11083 发表于 2013-11-15 07:34 static/image/common/back.gif
+如果没溢出的话没事,如果溢出了就杯具了。
而且,还有一个重要的问题,就是得搞清楚CPU是大端的还是小 ...

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

as9901 发表于 2013-11-15 07:54:16

我一般这么写

uint16 F(uint8 a,uint8 b)
{
    union{
      uint8 u8;
      uint16 u16;
      }R;
    R.u8=a;
    R.u8=b;
    return R.u16
}

Making 发表于 2013-11-15 08:11:55

as9901 发表于 2013-11-15 07:54 static/image/common/back.gif
我一般这么写

uint16 F(uint8 a,uint8 b)


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

YUZH282 发表于 2013-11-15 08:35:27

8位的话就只能是a=a+b;

Firman 发表于 2013-11-15 08:54:32

char a,b;
int c;
c=a<<8 + b;

fsclub 发表于 2013-11-15 08:59:59

加256不可以?

asj1989 发表于 2013-11-15 09:02:51

我一般这么写

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

onece 发表于 2013-11-15 09:09:15

用联合数据类型

laujc 发表于 2013-11-15 09:12:50

asj1989 发表于 2013-11-15 09:02 static/image/common/back.gif
我一般这么写

a = ((uint16_t)a

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

qllaoda1 发表于 2013-11-15 11:53:13

你说的是两个普通变量还是51的特殊寄存器,如果是51的特殊寄存器,可以用sfr16定义16位寄存器,标准51里也有几个sfr16的寄存器,你可以参考下。
如果是普通变量,就按上面的做法吧。

sunocean 发表于 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;
}

sun_sky 发表于 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;

unifax001 发表于 2013-11-15 17:17:29

unsigned int a,b;
a=((unsigned char) a<<8) | ((unsigned char) (b & 0x00ff));

王海峰 发表于 2013-11-15 21:14:03

char a,    char b ,   int c

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

王海峰 发表于 2013-11-15 21:18:48

c = a;
c = (c << 8) + b;//   这样比较好

112207301219 发表于 2013-11-15 22:21:59

int result;
union
{
   int a=0;
   char b={0};
}c;
c.b=reg1;
c.b=reg2;
result=c.a;

skyxjh 发表于 2013-11-15 22:39:55

int c, char a, char b;
c = a;
c <<= 8;
c += b;

xieyudi 发表于 2013-11-15 22:46:55

lcofjp 发表于 2013-11-15 07:43 static/image/common/back.gif
这个问题明显与大小端无关。。。。

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

Smartist 发表于 2014-3-12 14:21:15

悬赏2莫元?这也太少了吧
页: [1]
查看完整版本: 如何合并两个8位寄存器的值