从64位整数中提取32位

extract 32bit from 64bit integer

本文关键字:提取 32位 整数 64位      更新时间:2023-10-16

我有一个uint64_t整数,并通过以下代码将最后32位提取为uint32_t数:

uint32_t getLast(uint64_t v){
      uint64_t t= v >> 32;
      return  reinterpret_cast<uint32_t &>( t ); // type-punned pointer warning
}
int main()
{
    uint64_t a = 1l << 33 | 1l << 3;
    std::cout << getLast(a) << std::endl; // prints 2
}

这段代码给出了警告:

warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
       return  reinterpret_cast<uint32_t &>( t );

我想解决这个问题,但不是通过使用联合类型。

reinterprete_cast给出未定义的行为,当访问数据(复制重新解释的东西到返回值)(我认为?)

另一个似乎有效的解决方案?

 uint32_t getLast(uint64_t v){
    return (v >> 32) // conversion from bitshifted 64bit to 32bit, but what is with overflow?
 }

我有点困惑,关于reinterpret_cast的未定义行为?那么我应该如何使用reinterpret_cast,我认为这个例子是典型的使用模式?第二种方法也安全吗?

你应该只是static_cast<uint32_t>

reinterpret_cast几乎是专门用于高度危险和可能非法的指针强制转换。