jamesf1982等高人 两个字节转word方法 请写出详细步骤,多谢!!其他人也可回答

unsv29mj 2009-10-22 10:16:25
如何将两个byte转化成1个word(注意:byte是8位,word是16位)?

你以前回复说:

union 
{
byte b[2];
word w;
}a;

a.b[0]=1;
a.b[2]=2;


请写出完整代码

最好写出你这种方法的优点(不写也行呵呵呵)


http://topic.csdn.net/u/20091019/10/eece4e75-0f97-4a18-80b6-bb5249dca101.html
...全文
153 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
因为本问题还没解决 所以我的分是胡乱给的 不能说明谁说的对错!!!
james_hw 2009-10-22
  • 打赏
  • 举报
回复
byte b1;
byte b2;
word w;
w = (word)b1) < <8 | (word)b2;

这是常用的方法,但我并不觉得用union时会考虑到大小端问题,
union
{
byte b[2];
word w;
}a;

在小端时,b[0]在低指针,在大端时,b[0]在高地址,其和word的组合应该是一致的。(当然我没试过,因为我用到的地方都是小端)
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fengzuiye 的回复:]
引用 8 楼 jamesf1982 的回复:
union
{
    byte b[2];
    word w;
}a;

例如:
byte low_byte=1;
byte high_byte=2;
word k;

想把low_byte和high_byte组合成k,则将a.b[0]=low_byte;a.b[1]=high_byte;k=a.w;

这个做法的好处是便于组合与拆分,byte,word,dword之间可以随意组合与拆分,也是为了不用实现那么多宏。


这样的方式对于小端机和大端机并不统一吧
用移位的方法更加可靠一些
byte b1;
byte b2;
word w;
w = (word)b1) < <8 | (word)b2;
[/Quote]
你还是很牛的,有水平!!!


本质问题就是移位指令是从低地址向高地址的方向移位 还是 从低字节向高字节的方向移位??

这个到哪里查去??
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
最保险的方法

word = byte1 乘以 256 + byte2
fengzuiye 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jamesf1982 的回复:]
union
{
    byte b[2];
    word w;
}a;

例如:
byte low_byte=1;
byte high_byte=2;
word k;

想把low_byte和high_byte组合成k,则将a.b[0]=low_byte;a.b[1]=high_byte;k=a.w;

这个做法的好处是便于组合与拆分,byte,word,dword之间可以随意组合与拆分,也是为了不用实现那么多宏。

[/Quote]
这样的方式对于小端机和大端机并不统一吧
用移位的方法更加可靠一些
byte b1;
byte b2;
word w;
w = (word)b1)<<8 | (word)b2;
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复


题目要求是 假设两个byte分别是0x12和0x34 那么如果弄成1个word 0x1234

我是这个意思 请问怎么弄?用结构体怎么弄?
james_hw 2009-10-22
  • 打赏
  • 举报
回复
union
{
byte b[2];
word w;
}a;

例如:
byte low_byte=1;
byte high_byte=2;
word k;

想把low_byte和high_byte组合成k,则将a.b[0]=low_byte;a.b[1]=high_byte;k=a.w;

这个做法的好处是便于组合与拆分,byte,word,dword之间可以随意组合与拆分,也是为了不用实现那么多宏。
james_hw 2009-10-22
  • 打赏
  • 举报
回复
另外我的确写错了,应该是a.b[1]=2;

james_hw 2009-10-22
  • 打赏
  • 举报
回复
没什么特别的,原因在于使用方便,

union
{
unsigned char by[4];
unsigned short w[2];
unsigned int dw;
}t;

以前在项目中老是要把word组成dword,又或者要获取dword的高低位等等,用到了很多宏,感觉用的不是很方便,因此就弄了这个联合变量方便我转换适用
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 whg01 的回复:]
union
{
    byte b[2];
    word w;
}a; 这是定义
a.b[0]=1;
a.b[2]=2; 这是设置byte //这里应该是a.b[1]=2;吧
word val = a.w; 则是取word

[/Quote]

要求是转化成word!!!
unsv29mj 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 adlay 的回复:]
Windows 不是有 MAKEWORD 宏吗, 你环境不一样的话也可以拷过去用撒.

#define MAKEWORD(a, b) ((WORD)(((BYTE)((DWORD_PTR)(a) & 0xff)) | ((WORD)((BYTE)((DWORD_PTR)(b) & 0xff))) < < 8))
[/Quote]
不那么简单啊 adlay!!! 就怕拷过去也不好用啊
whg01 2009-10-22
  • 打赏
  • 举报
回复
union
{
byte b[2];
word w;
}a; 这是定义
a.b[0]=1;
a.b[2]=2; 这是设置byte
word val = a.w; 则是取word
Caballeroo 2009-10-22
  • 打赏
  • 举报
回复
BYTE b1 = 0x01;
BYTE b2 = 0x03;

WORD w = (b1 < <8)|b2;
// 这样b1是高8位



引用之前帖子上的。



我一般也是这样做的。
www_adintr_com 2009-10-22
  • 打赏
  • 举报
回复
Windows 不是有 MAKEWORD 宏吗, 你环境不一样的话也可以拷过去用撒.

#define MAKEWORD(a, b) ((WORD)(((BYTE)((DWORD_PTR)(a) & 0xff)) | ((WORD)((BYTE)((DWORD_PTR)(b) & 0xff))) << 8))

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧