从64位值获取最后两个字节

时间:2018-11-14 01:36:38

标签: 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&0x000000000000FFFF));
   return 0;
}

4 个答案:

答案 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。尝试改用PRIu64PRIx64宏。参见cpp.sh fiddle

#include <stdint.h>
#include <inttypes.h>

// ...

   printf("0x%" PRIx64 ".%" PRIu64 ".%04" PRIx64 "",
          (val&0xFFFFFFFF00000000)>>32, 
          (val&0x00000000FF000000)>>24,
          (val&0x000000000000FFFF)
          );