Недавно открыл для себя union в C и немного опешил от возможностей!
Это как хакинг памяти на легальных основаниях
Что такое union?
Это структура, где все поля используют ОДНУ И ТУ ЖЕ память. Записал в одно поле - читай из другого, но интерпретация битов будет другой!
#include <stdio.h>
#include <stdint.h>
union WTF {
int32_t integer;
float real;
uint8_t bytes[4];
};
void print_bits(uint32_t x) {
for (int i = 31; i >= 0; i--) {
printf("%d", (x >> i) & 1);
if (i % 8 == 0) printf(" ");
}
}
int main() {
union WTF data;
// Пробуем число 42
data.integer = 42;
printf("Integer: %d\n", data.integer); // 42
printf("Float: %f\n", data.real); // ❌ НЕ 42.0!
printf("Биты: ");
print_bits(data.integer);
printf("\n\n");
// А теперь правильно
data.real = 42.0f;
printf("Float: %f\n", data.real); // 42.0
printf("Integer: %d\n", data.integer); // ❌ НЕ 42!
printf("Биты: ");
print_bits(data.integer);
printf("\n");
return 0;
}
Вывод:
Integer: 42
Float: 0.000000
Биты: 00000000 00000000 00000000 00101010
Float: 42.000000
Integer: 1109917696
Биты: 01000010 00101000 00000000 00000000
union выделяет память под самый большой тип (здесь 4 байта)
Все поля (integer, real, bytes) указывают на одну область памяти
Когда пишешь в одно поле - перезаписываешь память для всех!
Тип определяет только КАК интерпретировать биты
Это не безопасное преобразование типов!
Это прямое манипулирование битами в памяти.
Кстати, в C# в unsafe коде тоже можно провернуть что то подобное!
[StructLayout(LayoutKind.Explicit)]
public struct MemoryHack
{
[FieldOffset(0)]
public int Integer;
[FieldOffset(0)]
public float Real;
[FieldOffset(0)]
public byte Byte0;
[FieldOffset(1)]
public byte Byte1;
}
Но имеет ограничения.