【问题标题】:extract 32bit from 64bit integer从 64 位整数中提取 32 位
【发布时间】:2015-08-02 16:59:43
【问题描述】:

我有一个 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,我认为这个例子是典型的使用模式?第二种方法也安全吗?

【问题讨论】:

    标签: c++ c++11 type-conversion


    【解决方案1】:

    你应该只是static_cast&lt;uint32_t&gt;reinterpret_cast 几乎专门用于高度狡猾且可能非法的指针转换。

    【讨论】:

    • 所以 static_cast 64bit 会忽略最后的 32bits?
    • 是的。标准行为是截断。请注意,签名和未签名的行为非常不同......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    相关资源
    最近更新 更多