Нет, это совсем не равнозначно.
Этот:
i = num;
преобразует значение числа num
(то есть 2.5
) из float
в int
. Преобразование усекает значение до 2
.
Этот:
i = *((int *)& num);
берет указатель на объект float
num
, преобразует его в int*
и разыменовывает результирующий указатель.
Если вам «повезло», это берет биты, составляющие представление num
, притворяется, что они являются представлением int
, и дает вам эти результаты.
Если вам не «повезло», то int
и float
могут быть разных размеров, объект float
может быть неправильно выровнен, чтобы его можно было рассматривать как объект int
, или результатом может быть даже «представление-ловушка» (хотя последнее редкий).
(Я взял слово «повезло» в кавычки, потому что на самом деле лучшее, что может сделать этот код, — это взорваться у вас перед носом, что немедленно даст вам понять, что вы делаете что-то сомнительное. Поведение такое: < em>undefined, что означает ошибку, но реализация не обязана предупреждать вас об этом ни во время компиляции, ни во время выполнения.)
Конкретное значение, которое вы получаете, 1075838976
, может быть представлено в шестнадцатеричном формате как 0x40200000
. Если вы посмотрите, как значения float
представлены в вашей системе, вы, вероятно, сможете понять, как эта битовая комбинация (0100 0000 0010 0000 0000 0000 0000 0000
) составляет значения знака, мантиссы и экспоненты, которые представляют значение 2.5
.
person
Keith Thompson
schedule
23.07.2013