Задать вопрос
@r1ch

Преобразование типов в си?

int i = 37; // 00000000000000000000000000100101 = 0.00000000.00000000000000000100101 = ((-1)^0)*1,00000000000000000100101*2^-127 = 1,00000000000000000100101*(1/1,701419339096245668434929897641e+38) = 0,000000
float f = *(float*)&i; // 0,000000

int i = -37; // 11111111111111111111111111011010 = 1.11111111.11111111111111111011010 = ((-1)^1)*1,1111111111111111111111111011010*2^255-127= -1,999999982304871082305908203125*3,4028236692093846346337460743177e+38 = -6,8056472782053657584265955775406e+38 
float f = *(float*)&i; // -1.#QNAN0 

float f = 7.0; // 0.10000001.11000000000000000000000 = 1088421888
int i = *(int*)&f; // 1088421888

float f = -7.0; // 1.01111110.00111111111111111111111 = -1059061760
int i = *(int*)&f; // -1059061760


Код на СИ. По какому алгоритму этот код получает из int => float, float=> int, как преобразуется мантисса и порядок в целое число?
  • Вопрос задан
  • 7286 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@AM5800
Отвечая на ваш вопрос об алгоритме: ни по какому.
У вас здесь происходит каст указателей.
То есть, в первом случае, у вас есть накоторая ячейка памяти, которая содержит число 37. Если на мгновение забыть о типах, то в этой ячейке лежит значение "...0100101"
Когда вы берете ее адрес (&i) - вы получаете указатель типа int. После каста, вы получаете указатель типа float. Изменяется тип указателя, но не данные на которые он указывает. После разыменования и присваивания вы получаете переменную f, значение которой все еще равно "...0100101".

Если же вас интересует именно устройство формата float. То, можно начать отсюда:
en.wikipedia.org/wiki/Single-precision_floating-po...
Ответ написан
@svd71_1
Алгоритм простой: компилятор берет область памяти под переменной и пытается его представить как другой тип. При этом нет проверки на совместимость типов: в int идет последовательность битов в 4х байтах, в float две части - вещественная и мантиса. Если преобразуемый тип имеет больший объем, чем изначальный, то в данных будет всякий хлам.
Ответ написан
IlyaEvseev
@IlyaEvseev
Opensource geek
Если sizeof(int) != sizeof(float), можно заработать на свою жопу очень интересный геморрой.

Хуже всего, что такой код реально приходилось встречать в production(!!!) в коммерческих кодеках.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы