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;
}