我想在C ++中设置/清除float和double的位并打印出结果。我很肯定long long bits = *(long long*)&doubleVar;
会调用未定义的行为。我不确定将其合并是否正确。如何在C ++中获取/设置float和double的位而不会引起未定义的行为?
答案 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)
使用memcpy
或bit_cast
执行此操作比较复杂。