Преобразовать целое число, чтобы плавать через указатель - PullRequest
0 голосов
/ 29 ноября 2018

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

int main()
{
    int a = 10;
    float* b;

    b = (float*)&a;

    printf("b = %f\n", *b);

    return 0;
}

В результате получается

b = 0.000000

На моей платформе float и int оба являются 4-битными.Кто-нибудь может дать мне знать, почему я не могу получить b = 10.0?Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018
  1. Когда вы конвертируете типы указателей и используете новый указатель для доступа к объекту, ваша реализация C может попытаться интерпретировать данные 1 как новый тип.Однако, это переосмысливает биты в памятиэто не преобразует значение.Кодировка для значения int 10 - это 32 бита 00000000000000000000000000001010. Для float эти биты являются кодированием для значения 1¼ • 2 −146 (при условии, что наиболее распространенным кодированием для float являетсяиспользуется вашей реализацией C).Это значение float настолько мало, что при форматировании с помощью %f оно округляется до нуля.

  2. Не используйте преобразования указателей для преобразования или повторной интерпретации данных.Чтобы преобразовать типы при сохранении значения (насколько это возможно, с учетом форматов), используйте приведение типа, например float b = (float) a;.(Во многих случаях само присвоение будет служить для преобразования таким способом.) Чтобы преобразовать типы при переинтерпретации битов, кодирующих значение, используйте memcpy (например, memcpy(&b, &a, sizeof b); или объединение. При этом вы должныубедитесь, что исходный и целевой объекты имеют одинаковый размер, и могут быть эффекты, зависящие от реализации, поскольку не все реализации C кодируют значения одинаковым образом.

  3. float и int - это четыре байта (в вашей реализации C), а не четыре бита.

Примечание

1 В общем случае указатели не следует преобразовыватьпереинтерпретировать данные. Есть некоторые исключения из этого, в частности, вы можете использовать типы символов для доступа к данным объекта.

0 голосов
/ 30 ноября 2018

Вы не конвертируете int 10 в число с плавающей точкой.Скорее, вы устанавливаете указатель b равным адресу a.НЕТ кастинга не было.Единственное, что ваш актерский состав выполнил, чтобы отключить проверку ошибок.

Что вы хотите?Если вы хотите, чтобы b удерживало указатель на представление с плавающей запятой, равное 10, вам нужно сделать следующее:

float b_float;
bptr = &b_float;
*bptr = (float) a;

Это то, что вы пытаетесь сделать?

0 голосов
/ 30 ноября 2018

Вы не конвертируете значение 10 из int в float, но конвертируете представление int со значением 10 в число с плавающей запятой.

Целые числа обычно хранятся в виде простой серии байтов, в основном, как число в базе 256. С другой стороны, типы с плавающей запятой имеют совсем другое представление, обычно IEEE 754 .

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