C язык - указатели и приведение - PullRequest
0 голосов
/ 19 апреля 2020

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

float f;
scanf("%f", &f);
unsigned int x = *(unsigned int*)&f;

Может кто-нибудь объяснить мне, как это работает?

Ответы [ 2 ]

7 голосов
/ 20 апреля 2020
unsigned int x = *(unsigned int*)&f;

в основном означает "взять адрес f, притвориться, что это адрес unsigned int вместо float, и разыменовать результат.

Он в основном пытается скопировать биты из f в x без какого-либо преобразования типов.

Как упоминалось в комментариях, это нарушает правило, известное как " строгое правило псевдонимов ", и поведение при выполнении undefined . Это может работать как положено. Возможно, не.

0 голосов
/ 20 апреля 2020

Просто в дополнение к ответу @John Bode, попробуйте (и, возможно, отладьте) следующий код, чтобы прояснить ситуацию.

Это похоже на один и тот же битовый шаблон;

  1. в очках float,
  2. в очках int.
#include <stdio.h>
#include <stdlib.h>

void printBits(int k) {
    char bitStr[33];

    // put a string terminator at end of string
    bitStr[32] = '\0';

    for (int i = 0; i < 32; i++) {
        if (k & 1) {
            bitStr[31 - i] = '1'; // if 32nd bit is 1
        }
        else {
            bitStr[31 - i] = '0'; // if 32nd bit is 0
        }

        k = k >> 1; // shift all bits 1 bit right, dropping the right most (32nd) bit
    }

    printf("%s", bitStr);
    return;
}

int main()
{
    float f = 1.0f;
    int i = *(int *)&f;

    printf("bit pattern ");
    printBits(*(int *)&f);
    printf(" equals to %f in float\n", f);

    printf("bit pattern ");
    printBits(i);
    printf(" equals to %d in integer\n", i);

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