高16位和低16位的合并与提取应该怎样实现?

rxm2006 2010-01-12 01:41:53
我现在有2个16位的数字,想先合并成32位的传递给其他地方,然后在那边获取后,分别提取出高16位和低16位的数据,该怎么做呢?

例如:

int16 a = 100;
int16 b = 200;

int32 c = a|b ?(不会写,大概就是类似的格式吧,实现将a放入c的高16位,b放入c的低16位)。

然后开始一些列的函数调用,假设到达目的地后位int32 c_dest.

再定义2个16位来存放其高地位。

int16 h = c_dest << 16;
int16 l = c_dest >> 16;

麻烦帮忙看看
...全文
1399 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
苍蝇①号 2010-01-12
  • 打赏
  • 举报
回复
合并:
int16 a = 100;
int16 b = 200;
int32c = a < <16 | b;

拆:
int16 h = c_dest >> 16;
int16 l = c_dest & 0x0000ffff;
traceless 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 versaariel 的回复:]
int32c = a < <16 | b;
问下
a < <16没有overflow?
觉得好象是
int32c = (int32c)a <<16|b
[/Quote]
?? 你的意思是会造成bit缺漏,不会的了
我也想过要是否进行强制转换,但是这里是计算表达式,会类型提升的。
如果是直接赋值,short a = 0x123456;就会所谓的overflow了
wind00sky 2010-01-12
  • 打赏
  • 举报
回复
移位运算,加上或与非就可以了
versaariel 2010-01-12
  • 打赏
  • 举报
回复
int32c = a < <16 | b;
问下
a<<16没有overflow?
觉得好象是
int32c = (int32c)a<<16|b
xylicon 2010-01-12
  • 打赏
  • 举报
回复 1
win sdk 中定义了几个宏。

#define MAKELONG(a, b) ((LONG)(((WORD)((DWORD_PTR)(a) & 0xffff)) | ((DWORD)((WORD)((DWORD_PTR)(b) & 0xffff))) << 16))

#define LOWORD(l) ((WORD)((DWORD_PTR)(l) & 0xffff))
#define HIWORD(l) ((WORD)((DWORD_PTR)(l) >> 16))
james_hw 2010-01-12
  • 打赏
  • 举报
回复
上面是word型的
james_hw 2010-01-12
  • 打赏
  • 举报
回复
#define oss_set_high_byte(a,b) (a&0xff)|=b<<16
traceless 2010-01-12
  • 打赏
  • 举报
回复
合并:
int16 a = 100;
int16 b = 200;
int32c = a<<16 | b;

拆:
int16 h = c_dest >> 16;
int16 l = c_dest & 0x0000ffff;

69,373

社区成员

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

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