2016-10-19 4 views
0

Что делает (float*) специально делать в случае g. Если я напишу g = *&i;, то вывод будет нормальным, т. Е. G = f, но если g = *(float*)&i;, то почему g = 0,0000 ???Тип литья указателя для разных типов данных

#include <stdio.h> 

int main() 
{ 

int i = 37; 
int *p; 
p = &i; 
float f = i; 
printf("%d\n", i); 
printf("%d\n", p); 
printf("%d\n", *p); 
float g = *(float*) &i; 
printf("i = %d f = %f g = %f", i, f, g); 
} 

ответ

0

g = *&i - это то же самое, что и g = i и является присвоением int в поплавок. Компилятор выполняет преобразование через оператора =:

  1. Загрузить целое число, 2. преобразовать в формате с плавающей запятой, 3. сохранить в поплавке. Отлично работает рядом с проблемами округления.

Другая конструкция переинтерпретирует целочисленный указатель на указатель поплавка. Поскольку форматы данных различны для float (float обычно использует некоторые биты для мантиссы и некоторые биты для экспоненты), а для ints (ints просто сериализуется в память 8-бит на 8 бит) компилятор просто копирует данные из источника в назначения без какой-либо дополнительной конверсии, и вы не получите то, что хотите.

+0

Что такое «переинтерпретация целочисленного указателя на указатель с плавающей точкой» и как он отличается от «назначения int в float»? –

+1

'int' to' float' присваивание может потерять значимость, если значение 'int'> = 2 ** 24. –

+0

отредактирован с более подробной информацией. @WeatherVane в порядке (я понимаю, 24 лучше, чем 16). –

0

В строке:

g = *&i; 

операторы * и & компенсируют друг друга, так что результат, как если бы код был:

g = i; 

Линия :

float g = *(float*) &i; 

вызывает неопределенное поведение, поскольку типы int и float несовместимы.

Результат, который вы видите, вызван неопределенным поведением, хотя в вашем случае поведение относительно доброкачественное. Случается, что биты переменной типа int интерпретируются так, как если бы они были типа float.

Кастинг через указатель не является правильным способом интерпретации битов другого типа.

Смежные вопросы