C 从64位值中获取最后两个字节
当我运行以下代码时,我得到了C 从64位值中获取最后两个字节,c,bit-manipulation,C,Bit Manipulation,当我运行以下代码时,我得到了0xABCDABCD.0.1。我想从val中获取最后两个字节01b0,但输出显示为1。我使用:0x000000000000FFFF uint64_t val = 0xabcdabcd010001b0; int main() { printf("0x%X.%d.%x",(val&0xFFFFFFFF00000000)>>32, (val&0x00000000FF000000)>>24,(val&0x
0xABCDABCD.0.1
。我想从val中获取最后两个字节01b0
,但输出显示为1
。我使用:0x000000000000FFFF
uint64_t val = 0xabcdabcd010001b0;
int main() {
printf("0x%X.%d.%x",(val&0xFFFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,(val&0x000000000000FFFF));
return 0;
}
也许这个精巧的版本对你有用:
#include <stdio.h>
#include <stdint.h>
uint64_t val = 0xabcdabcd010001b0;
int main() {
void *p1, *p2, *p3;
p1 = (void *) (val & 0xFFFFFFFF00000000 >> 32);
p2 = (void *) (val & 0x00000000FF000000 >> 24);
p3 = (void *) (val & 0x000000000000FFFF);
printf("%p.%p.%p\n",p1, p2, p3);
return 0;
}
#包括
#包括
uint64_t val=0xABCD010001B0;
int main(){
无效*p1、*p2、*p3;
p1=(void*)(val&0xFFFFFFFF00000000>>32);
p2=(void*)(val&0x00000000FF000000>>24);
p3=(void*)(val&0x000000000000FFFF);
printf(“%p.%p.%p\n”,p1、p2、p3);
返回0;
}
指针类型可以在x64机器中将这些int作为地址处理的技巧。问题在于位掩码的结果是
uint64\t
类型。要正确打印,您需要以下代码:
#包括
#包括
uint64_t val=0xABCD010001B0;
int main(){
printf(“0x%”PRIX64“%”PRId64“%”PRIX64“%”,
(val&0xFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,
(val&0x000000000000FFFF));
返回0;
}
请参阅上的“std::fprintf函数族的格式常量”一节。
%X
和%d
需要int
参数,但您正在传递uint64\u t
。尝试改用PRIu64
和PRIx64
宏。见:
#包括
#包括
// ...
printf(“0x%”PRIx64“%”PRIu64“%04”PRIx64“,
(val&0xFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,
(val&0x000000000000FFFF)
);
我冒昧地为您重写了代码,去掉了大量的掩码,添加了printf定义的糟糕的inttypes
#include <inttypes.h>
#include <stdio.h>
uint64_t val = 0xabcdabcd010001b0;
int main() {
printf("0x%" PRIX64 ".%" PRIx64 ".%04" PRIx64 "\n",
val >> 32,
(val >> 24) & 0xFF,
val & 0xFFFF
);
return 0;
}
#包括
#包括
uint64_t val=0xABCD010001B0;
int main(){
printf(“0x%”PRIX64“%”PRIX64“%04”PRIX64“\n”,
val>>32,
(val>>24)和0xFF,
val&0xFFFF
);
返回0;
}
请注意,唯一的功能更改是将前导零添加到第三个print参数。使用gcc 6.3.0编译代码我得到
0xABCDABCD.1.1b0
。它可以工作,但后两个值的前导零会被删除,如果需要,请使用%04x
。打开编译器警告<代码>警告:格式“%X”要求参数类型为“unsigned int”,但参数2的类型为“uint64_t”{aka“long unsigned int”}[-Wformat=]注意,p2
应根据原始代码以十进制打印。
#include <stdint.h>
#include <inttypes.h>
// ...
printf("0x%" PRIx64 ".%" PRIu64 ".%04" PRIx64 "",
(val&0xFFFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,
(val&0x000000000000FFFF)
);
#include <inttypes.h>
#include <stdio.h>
uint64_t val = 0xabcdabcd010001b0;
int main() {
printf("0x%" PRIX64 ".%" PRIx64 ".%04" PRIx64 "\n",
val >> 32,
(val >> 24) & 0xFF,
val & 0xFFFF
);
return 0;
}