C может превратить число 1 078 530 011 в число π. И это не магия!
В Python преобразование int в float создаёт число с новым числовым значением.
В C можно сделать совершенно другое: интерпретировать те же самые 4 байта как число другого типа.
include
include
include
int main(void) {
uint32_t bits = 0x40490fdb;
float pi;
memcpy(&pi, &bits, sizeof(pi));
printf("%.6f\n", pi);
// 3.141593
return 0;
}
Что здесь происходит?
- 0x40490fdb - набор из 32 бит.
- memcpy копирует эти биты в память переменной float.
- IEEE 754 интерпретирует их как число с плавающей точкой.
- На выходе получаем приблизительное значение π: 3.1415927.
Два принципиально разных действия:
- float(123) - преобразовать числовое значение.
- memcpy - перенести битовое представление без изменения.
Этот приём называется *type punning*. Через memcpy его можно реализовать в C без нарушения правил strict aliasing.
Условие: здесь предполагается 32-битный IEEE 754 float.
Один и тот же набор битов может означать совершенно разные вещи в зависимости от типа данных.