Понимание Союзов в C - PullRequest
       5

Понимание Союзов в C

0 голосов
/ 01 марта 2019

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

Это преобразуется в двоичный код (25 бит): 101111000110000101001110

В объединении, которое я создал с именем temp_union, я создал переменную с плавающей точкой (value2)и целочисленный массив с 4 байтами, называемый value1.

Затем я сохраняю температуру в объединенном значении2.

Когда я отображаю значение1 [0], разве это не должно печатать первые 8 бит числа с плавающей запятой?И значение [1] следующих 8 битов, значение [2] следующих 8 битов и т. Д.

So displaying value1[0] as an integer, would be 78 (01001110)
Displaying value1[1] as an integer, would be 97 (01100001)
Displaying value1[2] as an integer, would be 188 (10111100)

Вместо этого я получаю следующее:

value1[0]: 1262248270                                                                                                                          
value1[1]: 32766                                                                                                                               
value1[2]: 0                                                                                                                                   
value1[3]: 0 

Мой кодниже:

 #include <stdio.h>

    int main()
    {
    float temperature = 12345678;

    union union_data_type {
      int  value1[4];
      float value2;
    };

    union union_data_type temp_union;

    temp_union.value2 = temperature;

    printf("\n Temperature float value: ");
    printf("%f", temp_union.value2);

    printf("\n  Value 0: ");
    printf("%i", temp_union.value1[0]);


    printf("\n  Value 1: ");
    printf("%i", temp_union.value1[1]);

    printf("\n  Value 2: ");
    printf("%i", temp_union.value1[2]);

    printf("\n  Value 3: ");
    printf("%i", temp_union.value1[3]);


    }

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

размер с плавающей запятой обычно составляет 32 бита, что составляет 4 байта.'int' также обычно составляет 4 байта, поэтому я предполагаю, что у вас есть.

Итак, в вашем случае объединение состоит из 4-байтового числа с плавающей запятой и 16 байтов массива int.только первые 4 байта (значение1 [0]) массива перекрываются с элементом float.

ваш объединение выглядит в памяти следующим образом

  addr     int value1[4]    float value2
 00000000  [0]  4 bytes       4 bytes
 00000004  [1]  4 bytes       ---
 00000008  [2]  4 bytes       ---
 0000000C  [3]  4 bytes       ---

, где здесь addr представляет смещение отрасположение стека, предоставленное вам,

Когда вы инициализируете число с плавающей запятой, вы также инициализируете значение1 [0].Остальное остается неинициализированным и является просто мусором.

float обычно представляется кодированием, определенным в стандарте IEEE 754 (https://en.wikipedia.org/wiki/Single-precision_floating-point_format), и его биты интерпретируются процессором и службами печати.Одинаковые биты для int интерпретируются по-разному.

Итак, ваш результат показывает значение1 [0], которое является int представлением float битов, и неинициализированные значения для других членов массива.

0 голосов
/ 01 марта 2019

Когда я отображаю value1[0], разве это не должно печатать первые 8 бит числа с плавающей запятой?И value[1] следующие 8 битов, value[2] следующие 8 битов и т. Д.

Нет.int обычно имеет длину 32 бита.Так что в вашем случае с temp_union.value1[0] вы получите первые 32 бита вашего значения с плавающей запятой.Если вы хотите получить доступ к одному байту за раз, измените свой союз на

union union_data_type {
  uint8_t  value1[4];
  float value2;
};

. Для этого вам потребуется #include <stdint.h>.Но в отношении вашего понимания того, как работает профсоюз, вы правы.

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