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.

Один и тот же набор битов может означать совершенно разные вещи в зависимости от типа данных.
Просмотры: 9 263
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти