Быть чрезмерно педантичным, это недопустимо в C или C ++.
Я подозреваю, что каждый существующий компилятор поддерживает его, но для стандарта недопустимо писать один член объединения, а затем читать другой. Однако даже если вы знаете, что float
и unsigned
имеют одинаковый размер, вы уже используете некоторую информацию, определяемую реализацией, так что вы можете также использовать больше. Это распространено и обычно работает.
Для справки, вы всегда можете исследовать память как последовательность байтов:
#include <iostream>
#include <iomanip>
#include <climits>
#include <cassert>
int main() {
float f = 0.3;
unsigned char *buf = (unsigned char*)(&f);
// Now we just have to print the sucker.
assert(CHAR_BIT == 8); // otherwise hex isn't much use
// This shows the byte representation, low addresses on the left.
// On a little-endian machine, you might like to count down for
// convenience of reading.
for (int i = 0; i < sizeof f; ++i) {
std::cout << std::hex << std::setw(2) << std::setfill('0');
std::cout << static_cast<unsigned int>(buf[i]) << ' ';
}
std::cout << '\n';
}
Вывод (на моей машине):
9a 99 99 3e
Если вы предпочитаете использовать unsigned
вместо unsigned char
:
#include <cstring>
float f = 0.3;
unsigned u;
assert(sizeof f == sizeof u);
std::memcpy(&u, &f, sizeof f);
std::cout << std::hex << u << "\n";
Вывод (на моей машине):
3e99999a