如何将两个short类型值拼成一个int类型的值

pan7861 2009-05-11 12:54:28
unsigned short i = 123;
unsigned short j = 321;
现在我要调一个函数如下:
void test(unsigned char len,unsigned char* pdata);

我怎么把两个字节的i和j拼成一个四个字节当整形通过test函数传递出去,收到后如何解出来这两个short类型的值呢?len的值应该是sizeof(int)。
...全文
2470 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
liliangbao 2009-05-12
  • 打赏
  • 举报
回复
移位然后相加~
foxyz123 2009-05-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 foxyz123 的回复:]
移位运算,在通信里经常用到的
[/Quote]

就是把几个短数据组合成一个长数据,表达一定的意义,然后发送给接收方,然后由接收方decode得到真正意义
foxyz123 2009-05-12
  • 打赏
  • 举报
回复
移位运算,在通信里经常用到的
pan7861 2009-05-12
  • 打赏
  • 举报
回复
悬赏分少了,怎么能追加分数啊?
flora186 2009-05-11
  • 打赏
  • 举报
回复
学习了
赵4老师 2009-05-11
  • 打赏
  • 举报
回复
#include <stdio.h>
unsigned short i = 123;
unsigned short j = 321;
unsigned char buf[4];
void test (unsigned char len,unsigned char* pdata) {
printf("len=%d,i=%d,j=%d\n",len,*((unsigned short *)pdata),*((unsigned short *)pdata+1));
}
void main() {
*((unsigned short *)buf)=i;
*((unsigned short *)buf+1)=j;
test(4,buf);
}
运行结果
len=4,i=123,j=321
yylklshmyt20090217 2009-05-11
  • 打赏
  • 举报
回复
int k=0;
k=i;
k<<16;
k+=j;



j=unsigned short(k&0xffff);
i=unsigned short(k>>16);
Albertxi 2009-05-11
  • 打赏
  • 举报
回复
学习中,赞扬下提出好方法的朋友们~
  • 打赏
  • 举报
回复
移位操作实现最简单!
mallco 2009-05-11
  • 打赏
  • 举报
回复
合并的时候可以用结构体
struct {
unsigned short a,
unsigned short b,
}ints;
unsigned short i = 123;
unsigned short j = 321;
ints.a = i;
ints.b = j;

int instance;
unsigned short* sp = (unsigned short*)&instance;

*sp = ints.a;
*(sp+1) = ints.b;

使用的时候
unsigned short i1 = (unsigned short)((instance >> 16)&0xFFFF);
unsigned short j2 =(unsigned short)(instance & 0xFFFF);

  • 打赏
  • 举报
回复
位移操作就搞定了。
cheng_fengming 2009-05-11
  • 打赏
  • 举报
回复
似乎不对!
cheng_fengming 2009-05-11
  • 打赏
  • 举报
回复
i: 0000 0000 0111 1011 //123;
j: 0000 0001 0100 0001 //321;
-------------------------------------------
0000 0000 0111 1011 0000 0001 0100 0001
是不是这样?
可以把i和j 的值转化成字符串,然后进行连接在转化成int型就可以了!
pathuang68 2009-05-11
  • 打赏
  • 举报
回复 2
sorry, 2楼有笔误,应该是0xffff0000或者0x0000ffff,下面的代码经过验证:

#include <iostream>
using namespace std;

// 两数合并函数
unsigned int combine(unsigned short a, unsigned short b)
{
return (unsigned int)(a<<16)|b;
}
// 分拆函数,第一个参数为合并后的unsigned int,后面分别为原来的两个unsigned short的返回值
void retract(unsigned int combinedInteger, unsigned short &a, unsigned short &b)
{
a = (unsigned short)((combinedInteger & 0xffff0000) >> 16);
b = (unsigned short)combinedInteger & 0x0000ffff;
}

int main(void)
{
unsigned short a = 123;
unsigned short b = 321;
unsigned int c = 0;
c = combine(a, b);
cout << "Combined integer is: " << c << endl;

unsigned short d = 0;
unsigned short e = 0;
retract(c, d, e);
cout << "Rectracted d = " << d << endl;
cout << "Rectracted e = " << e << endl;

return 0;
}


输出结果:
Combined integer is: 8061249
Rectracted d = 123
Rectracted e = 321
ilei3344 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 windowsxp0925 的回复:]
赞一个,最简捷高效的方法就是这个,不过LZ的问题中test返回的是void的,参数里又没有输出参数,我不知道如何把int返回出去,难道是全局变量?
[/Quote]
函数有输入参数,输出参数,在输出参数中返回int数,可以用指针或者引用。
除了上面的那个方法(高效),也可以用MAKEWORD(好理解一点),用HIBYTE,LOBYTE恢复。
pathuang68 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pan7861 的回复:]
引用 2 楼 mosaic 的回复:
不知道是不是这个意思?

假设short为2字节,int为4字节:

unsigned int k=i;
k=k < <16;
k=k|j;

把k传出去。

收到之后
i=(unsigned short)(k&0xff00)>>16;
j=(unsigned short)k&0x00ff;


那最终调用test函数应该是test(sizeof(k),&k);是么?
unsigned int 和unsigned char*不需要转么
[/Quote]
楼主那个test函数改改就好了,不需要unsigned char*这些东西的。
pathuang68 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
不知道是不是这个意思?

假设short为2字节,int为4字节:

unsigned int k=i;
k=k < <16;
k=k|j;

把k传出去。

收到之后
i=(unsigned short)(k&0xff00)>>16;
j=(unsigned short)k&0x00ff;
[/Quote]
正解!
pan7861 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
不知道是不是这个意思?

假设short为2字节,int为4字节:

unsigned int k=i;
k=k < <16;
k=k|j;

把k传出去。

收到之后
i=(unsigned short)(k&0xff00)>>16;
j=(unsigned short)k&0x00ff;
[/Quote]

那最终调用test函数应该是test(sizeof(k),&k);是么?
unsigned int 和unsigned char*不需要转么
pan7861 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
不知道是不是这个意思?

假设short为2字节,int为4字节:

unsigned int k=i;
k=k < <16;
k=k|j;

把k传出去。

收到之后
i=(unsigned short)(k&0xff00)>>16;
j=(unsigned short)k&0x00ff;
[/Quote]

这个方法不错啊,我试试回头给分
windowsxp0925 2009-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mosaic 的回复:]
不知道是不是这个意思?

假设short为2字节,int为4字节:

unsigned int k=i;
k=k < <16;
k=k|j;

把k传出去。

收到之后
i=(unsigned short)(k&0xff00)>>16;
j=(unsigned short)k&0x00ff;
[/Quote]

赞一个,最简捷高效的方法就是这个,不过LZ的问题中test返回的是void的,参数里又没有输出参数,我不知道如何把int返回出去,难道是全局变量?
加载更多回复(2)

70,020

社区成员

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

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