2012-04-18 2 views
3

ВозьмитеInteger, как поплавок, разъяснение необходимости

int x = 5; 
float y = x; 

//"I know it's a float .. you know it's a float .. but take it's address 
// and pretend you're looking at an integer and then dereference it" 

printf("%d\n", *(int*)&y); //1084227584 

Почему я вижу этот номер?

  • 5 в двоичном виде 0101
  • 5 можно рассматривать как (1.25 * 2^2), что означает, что

Может быть представлена ​​в виде:

[sign bit]        - 0 
[8 bits worth of exp] - 129 (129-127=2) - 1000|0001 
[23 bits of .xxxxxxx] - 25    - 1100|1 

Соединенный, у меня есть

[sign bit][8 bits worth of exp][23 bits worth of .xxx] 
0   10000001    11001000000000 //2126336 

Что я пропущу, пожалуйста?

+1

Плавающее представление точек может варьироваться в зависимости от вашей архитектуры и окружающей среды. Какова ваша среда выполнения для этого кода? – cytinus

+0

hmm .. работает на 64-битном маке – JAM

ответ

3

Другие указали, что он не переносится ... но вы уже это знаете, и вы указали 64-разрядную ОС X. В принципе, у вас есть мантисса неправильно. 1.25 представлен неявным ведущим битом для 1.0. Первый явный бит мантиссы представляет 0.5 и второй бит 0.25. Итак, мантисса на самом деле: 01000000000000000000000.

Знаковые бит 0 и предвзятый показатель 10000001, а затем мантиссы дает: 0x40a00000 который 1084227584 десятичное.

+0

. Пожалуйста, обновите ответ, чтобы включить весь шаблон бита – JAM

+0

@JAM? Я уже предоставил битовые шаблоны знака, экспоненты и мантиссы. –

+0

Ой, извините, да, пришлось перечитать его снова. спасибо – JAM

0

Почему я вижу этот номер? Потому что вы печатаете float как int.

Я знаю, я знаю, вы, очевидно, уже знаете это, но нижняя строка - это поведение не определено. В вашей системе есть ints и плавает одинаковый размер? Вы искали стандарты, которые использует ваш компилятор для хранения плавающих точек?

+1

Ну, идея состоит в том, чтобы увидеть, как кастинг для int * изменяет способ понимания битов компилятором. Я, конечно, ожидаю другого (большого) числа, просто хочу понять, почему я вижу то, что вижу – JAM

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