Что происходит, когда указатель с плавающей точкой типизирован до указателя на символ? - PullRequest
1 голос
/ 16 июля 2009
int main()
{
    float f = 12.2;
    char *p1;
    p1 = (char *)&f;
    printf ("%d", *p1);
}

Это выводит 51.

Ответы [ 5 ]

17 голосов
/ 16 июля 2009

Вы можете разыграть a float* до char* просто отлично, это с использованием такого зверя, который может быть проблематичным.

Когда вы отмените ссылку на него, вы просто получите char представление первой части (но см. Ниже, чтобы понять, что это на самом деле означает, что это не так ясно, как вы думаете) о плавании.

Если вы говорите о числах с плавающей запятой IEE754, 12.2 в числах с плавающей запятой IEEE754 - это (abcd - октеты):

S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM (sign, exponent, mantissa).
0 10000010 10000110011001100110011
a aaaaaaab bbbbbbbccccccccdddddddd

00110011 в конце - это 51 (0x33), который вы видите. Причина, по которой вы видите последний бит поплавка, заключается в том, что он хранится в памяти следующим образом (в архитектуре с прямым порядком байтов):

00110011 00110011 01000011 01000001
dddddddd cccccccc bbbbbbbb aaaaaaaa

, что означает, что char* состав float* будет указывать на dddddddd часть.

На архитектурах с прямым порядком байтов вы получите aaaaaaaa бит, 01000001 или 65 (0x41).

1 голос
/ 16 июля 2009

Вопрос:

что происходит, когда тип с плавающей запятой приводится к указателю на символ

Точный ответ:

Неопределенное поведение.

1 голос
/ 16 июля 2009

Предполагая, что другие упомянутые проблемы устранены, вы получаете целочисленную версию того, какой битовый шаблон будет для этого числа с плавающей запятой. Float имеет довольно сложную кодировку, поэтому он не будет иметь ничего общего с числом, которое вы указали в float.

1 голос
/ 16 июля 2009

В основном то, что говорит EFraim, кроме того, что вы произвели приведение к char *, только разметка stackoverflow была неправильной.

Таким образом, вы получаете младший байт внутреннего представления f (в ​​IEEE-754).

1 голос
/ 16 июля 2009
  1. Вы применяете к (char) вместо (char *).
  2. Вы печатаете это как целое число.
  3. Таким образом, вы получите младший байт адреса f.

EDIT: в соответствии с новой разметкой вы действительно усекаете представление с плавающей запятой до его младшего байта (на младших байтовых машинах)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...