如何在没有未定义行为的情况下修改float / double位?

时间:2018-08-10 02:21:55

标签: c++ undefined-behavior

我想在C ++中设置/清除float和double的位并打印出结果。我很肯定long long bits = *(long long*)&doubleVar;会调用未定义的行为。我不确定将其合并是否正确。如何在C ++中获取/设置float和double的位而不会引起未定义的行为?

2 个答案:

答案 0 :(得分:5)

为避免未定义的行为,您需要使用memcpy()的一种简单方法是使用建议的模板std::bit_cast<to_type>(from_type from)

您可以在https://en.cppreference.com/w/cpp/numeric/bit_cast中获得包装此操作的模板(仅建议使用此模板),该模板易于使用:

double pun_me=3.0;
std::uint64_t ui64=my_namespace::bit_cast<uint64_t>(pun_me);

将它放在单独的命名空间中是个好主意,这样当它在C ++ 20中出现时,就不会发生冲突。您可以让他们修改所需的内容,然后将其转换回去。

答案 1 :(得分:0)

为此,如果需要修改现有unsigned char * / float的某些位,则可以使用double,这是最简单但仍符合标准的方法。参见:

float a = 1.0f;
unsigned char *x = reinterpret_cast<unsigned char *>(&a);
x[3] ^= 0x80; // let's change sign of a (assuming IEEE-754, and little-endian, 8-bit chars)

使用memcpybit_cast执行此操作比较复杂。