C 如何使用2个指针形成64位数字?

C 如何使用2个指针形成64位数字?,c,pointers,C,Pointers,假设我有两个指针 uint64_t* ptr1; uint64_t* ptr2; 我必须形成一个var值,以便从ptr1中提取6个字节,从ptr2中提取2个字节,当前ptr1已经消耗了它的初始2个字节,现在剩下的要处理的字节是6个字节 我写了这样的东西 uint64_t value = (uint64_t)((*ptr1) >> 16);\ value = (uint64_t)(value << 16 | (*ptr2 & 0x000000000000ffff)

假设我有两个指针

uint64_t* ptr1;
uint64_t* ptr2;
我必须形成一个var值,以便从ptr1中提取6个字节,从ptr2中提取2个字节,当前ptr1已经消耗了它的初始2个字节,现在剩下的要处理的字节是6个字节

我写了这样的东西

uint64_t value = (uint64_t)((*ptr1) >> 16);\
value = (uint64_t)(value << 16 | (*ptr2 & 0x000000000000ffff));\
uint64_t值=(uint64_t)((*ptr1)>>16)\

value=(uint64_t)(value我不太确定您在这里想做什么,您的问题有些模糊……但据我所知,我会尝试:

你的最后一行

value = (uint64_t)((*ptr1 & ~0x000000000000ffff)  << 16 | (*ptr2 & 0xffff000000000000));
将*ptr1的低48位与*ptr2的高16位相结合,或

value = (uint64_t)((*ptr1 & ~0x000000000000ffff) | (*ptr2 & 0x000000000000ffff));
它结合了*ptr1的高48位和*ptr2的低48位,甚至可能

value = (uint64_t)((*ptr1  >> 16) | (*ptr2 & 0x000000000000ffff) << 48);
value=(uint64_t)((*ptr1>>16)(*ptr2&0x000000000000ffff)首先写入掩码

#define mask 0xFFFFFFFFFFFF 
ptr1
中提取6个字节并存储它们

const uint64_t first_six = *ptr1 & mask;
const uint16_t last_two = *ptr2 & 0xFFFFull;
ptr2
中提取2个字节并存储它们

const uint64_t first_six = *ptr1 & mask;
const uint16_t last_two = *ptr2 & 0xFFFFull;
最后,把它们放在一起

uint64_t value = (first_six << 16) | last_two;
uint64\u t值=(前六个
结果为
123456789abc00

12 34 56 78 9a bc 00 00  << 16 
(*ptr2 & 0xffff000000000000)) 
56 78 9a bc 00 00 00 00 | 12 23 00 00 00 00 00 00 
结果
123400

12 34 56 78 9a bc 00 00  << 16 
(*ptr2 & 0xffff000000000000)) 
56 78 9a bc 00 00 00 00 | 12 23 00 00 00 00 00 00 
结果为
??9a bc 00

12 34 56 78 9a bc 00 00  << 16 
(*ptr2 & 0xffff000000000000)) 
56 78 9a bc 00 00 00 00 | 12 23 00 00 00 00 00 00 
它没有将
*ptr1
的前6个字节与
*ptr2
的最后2个字节相加

我建议

(uint64_t)((*ptr1 & ~0x000000000000ffff)  | (*ptr2 & 0x000000000000ffff));

OP错误地试图从太窄的常量生成64位掩码

在小于64位的
int/unsigned
0x000000000000ffff
机器上,是一个宽度“小于64”的常数。在32位机器上,
~0x000000000000ffff
-->
0xffff0000
而不是所希望的
0xffffffff0000

12 34 56 78 9a bc 00 00  << 16 
(*ptr2 & 0xffff000000000000)) 
56 78 9a bc 00 00 00 00 | 12 23 00 00 00 00 00 00 
追加
LL
将确保常量至少为64位

实现“形成一个var值,以便从ptr1获取6个字节,从ptr2获取2个字节”

#定义字节7to2_掩码(0xFFFFFFFFFF0000)
#定义字节1到0_掩码(0xffff)

值=(*ptr1和字节数7to2_掩码)>>16)| |(*ptr2和字节数1to0_掩码)首先做
const uint64\u t x=*ptr1,y=*ptr2;
,现在你不再有两个指针了。我只是想说指针本身不是这里有趣的东西。从
*ptr1
中哪6个字节,从
*ptr2
中哪2个字节?从这个问题听起来你想要从fir中得到6个低阶字节st和第二个字节中的2个最高阶字节。是这样吗?你考虑了endianness吗?没错。我还想知道endianness在屏蔽期间是否重要?只有这是工作-uint64_t value=(uint64_t)(((*ptr1>>16)在屏蔽值时endianness不重要。只有这是工作-uint64_t value=(uint64_t)((* pTr1> 16)当你查看数据的布局时,要考虑到它的特殊性;每当你对它应用实际操作时,你不需要考虑。当你做代码> 4 + 4 < /代码>时,你不考虑它的迂回性。例如,谢谢你的视觉解释!它也是有效的!怀疑关于<代码> ~0x00 00 000 000 000 FFFF < /代码>尝试<代码> PrimTf(“大小%zu\n”,sizeof(0x000000000000ffff));printf(“大小%zu\n”,sizeof(~0x000000000000ffff));
某些代码应该是
~((uint64_t)0x000000000000ffff)
。它工作正常,因为最后一个字节与前两个字节相同。我希望ptr1的最后6个字节与ptr2的前两个字节相同。使用32位
int/unsigned
~0x000000000000ffff
-->
0x00000000ffff0000
,而不是
0xFFFFFFFFFF0000