运行以下代码时,我得到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;
}
答案 0 :(得分:1)
问题在于位掩码的结果为uint64_t
类型。要正确打印,您需要以下代码online here:
#include <stdio.h>
#include <inttypes.h>
uint64_t val = 0xabcdabcd010001b0;
int main() {
printf("0x%" PRIX64 ".%" PRId64 ".%" PRIx64,
(val&0xFFFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,
(val&0x000000000000FFFF));
return 0;
}
请参阅this page for more formats上的“格式化std :: fprintf函数系列的常量”部分。
答案 1 :(得分:1)
我可以自由地为您重写代码,删除大量的掩码,并添加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;
}
请注意,唯一的功能更改是在第三个打印参数上添加前导零。
答案 2 :(得分: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;
}
欺骗指针类型可以将这些int作为x64机器中的地址来处理。
答案 3 :(得分:0)
%X
和%d
需要int
参数,但是您正在传递uint64_t
。尝试改用PRIu64
和PRIx64
宏。参见cpp.sh fiddle:
#include <stdint.h>
#include <inttypes.h>
// ...
printf("0x%" PRIx64 ".%" PRIu64 ".%04" PRIx64 "",
(val&0xFFFFFFFF00000000)>>32,
(val&0x00000000FF000000)>>24,
(val&0x000000000000FFFF)
);