已知一个数(UINT64)的高位(DWORD)和低位(DWORD)数,能得到这个数本身吗?

feel_myself_is_lowB 2019-11-19 04:27:51
UINT64 GetNum(DWORD high,DWORD low)
{
return ((((UINT64)high) << 32) | low);
}

high:是通过一个UINT64的数num得到的,(high = (DWORD)((num & 0xFFFFFFFF00000000) >> 32));
low: low = (DWORD)(num & 0x00000000FFFFFFFF);
num:得到high和low的基数

可能有点绕 ,我再说一下 ,我在一个函数中通过num得到high和low,现在要在另一个函数通过high和low中得到num;
...全文
1090 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿五-哈默迪 2019-12-30
  • 打赏
  • 举报
回复
话说为啥不用Union (联合)来做? 而且代码有问题吧? low 化为UINT64时,没有符号扩展吗?
happy study 2019-11-24
  • 打赏
  • 举报
回复
没看完不好意思。。。
happy study 2019-11-24
  • 打赏
  • 举报
回复
有可能打印的不对,lu%试下
onOneLight 2019-11-22
  • 打赏
  • 举报
回复
表示就看看
  • 打赏
  • 举报
回复
引用 35 楼 liou17 的回复:
虽然看不懂,感觉很牛逼的样子


取高低位数,高低位数取那个数本身
qq_123910382 2019-11-21
  • 打赏
  • 举报
回复
逻辑没问题的
GameK1ng 2019-11-21
  • 打赏
  • 举报
回复
同求这道题怎么做!!!!希望大神解答!万分感谢
liou17 2019-11-21
  • 打赏
  • 举报
回复
虽然看不懂,感觉很牛逼的样子
q554549213 2019-11-21
  • 打赏
  • 举报
回复
表示看不懂……
z1078503239 2019-11-21
  • 打赏
  • 举报
回复
引用 2 楼 datoulaile123 的回复:
知道位数就能得到啊,有高位有多少位就<<左移多少位嘛
hxn_wan 2019-11-21
  • 打赏
  • 举报
回复
老哥6666
luj_1768 2019-11-21
  • 打赏
  • 举报
回复
需要对低位也做明确的升位标记。
  • 打赏
  • 举报
回复
引用 21 楼 mymtom 的回复:
写法没有错啊,用几个例子测试一下,也许能发现问题

#include <assert.h>
#include <stdio.h>

UINT64 MAKEUINT64(DWORD high, DWORD low)
{
return (UINT64) ((((UINT64)((DWORD)high)) << 32) | ((UINT64)((DWORD)low)));
}

DWORD HIGHDWORD(UINT64 number)
{
return (DWORD) ((((UINT64)number) >> 32) & 0xffffffff);
}

DWORD LOWDWORD(UINT64 number)
{
return (DWORD) (((UINT64)number) & 0xffffffff);
}

int
main(int argc, char *argv[])
{
UINT64 number;
DWORD high;
DWORD low;

number = 0x0123456789abcdef;
high = HIGHDWORD(number);
low = LOWDWORD(number);
assert(high == 0x01234567);
assert(low == 0x89abcdef);
number = MAKEUINT64(high, low);
assert(number == 0x0123456789abcdef);

number = 0xfedcba9876543210;
high = HIGHDWORD(number);
low = LOWDWORD(number);
assert(high == 0xfedcba98);
assert(low == 0x76543210);
number = MAKEUINT64(high, low);
assert(number == 0xfedcba9876543210);

return 0;
}


引用 22 楼 pikepen 的回复:
应该没问题吧



没问题了的 ,已经解决了的。是在接收参数那里出了错,所以跟踪线程的时候得到的数据也是错的。
  • 打赏
  • 举报
回复
引用 20 楼 若歌 的回复:
[quote=引用 18 楼 feel_myself_is_lowB 的回复:]
[quote=引用 17 楼 若歌 的回复:]
问题估计就在你的UINT上 如果UINT64应该就没问题了



解决了,我去研究下 为什么UINT的时候 会将low的值赋给它[/quote]
有啥可研究的,你的8字节长度数据返回,存在四字节的容器中,肯定高字节就丢了啊[/quote]

对 ,就是这样
往事随风飞扬 2019-11-20
  • 打赏
  • 举报
回复
赞 完美解决
pikepeng 2019-11-20
  • 打赏
  • 举报
回复
应该没问题吧
mymtom 2019-11-20
  • 打赏
  • 举报
回复
写法没有错啊,用几个例子测试一下,也许能发现问题

#include <assert.h>
#include <stdio.h>

UINT64 MAKEUINT64(DWORD high, DWORD low)
{
return (UINT64) ((((UINT64)((DWORD)high)) << 32) | ((UINT64)((DWORD)low)));
}

DWORD HIGHDWORD(UINT64 number)
{
return (DWORD) ((((UINT64)number) >> 32) & 0xffffffff);
}

DWORD LOWDWORD(UINT64 number)
{
return (DWORD) (((UINT64)number) & 0xffffffff);
}

int
main(int argc, char *argv[])
{
UINT64 number;
DWORD high;
DWORD low;

number = 0x0123456789abcdef;
high = HIGHDWORD(number);
low = LOWDWORD(number);
assert(high == 0x01234567);
assert(low == 0x89abcdef);
number = MAKEUINT64(high, low);
assert(number == 0x0123456789abcdef);

number = 0xfedcba9876543210;
high = HIGHDWORD(number);
low = LOWDWORD(number);
assert(high == 0xfedcba98);
assert(low == 0x76543210);
number = MAKEUINT64(high, low);
assert(number == 0xfedcba9876543210);

return 0;
}
若歌 2019-11-20
  • 打赏
  • 举报
回复
引用 18 楼 feel_myself_is_lowB 的回复:
[quote=引用 17 楼 若歌 的回复:] 问题估计就在你的UINT上 如果UINT64应该就没问题了
解决了,我去研究下 为什么UINT的时候 会将low的值赋给它[/quote] 有啥可研究的,你的8字节长度数据返回,存在四字节的容器中,肯定高字节就丢了啊
铖邑 2019-11-20
  • 打赏
  • 举报
回复
引用 18 楼 feel_myself_is_lowB的回复:
[quote=引用 17 楼 若歌 的回复:]
问题估计就在你的UINT上 如果UINT64应该就没问题了



解决了,我去研究下 为什么UINT的时候 会将low的值赋给它[/quote] 这也要研究,计算机就是这么设计的,除非你要去研究底层芯片
wudixiaofengzi 2019-11-20
  • 打赏
  • 举报
回复
不知道,还没看出来是什么个情况。。。
加载更多回复(20)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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