О союзе в т - PullRequest
       53

О союзе в т

2 голосов
/ 23 декабря 2019
union a
{
    int i;
    char ch[4];
};
void main()
{
    union a u;
    u.ch[0]=3;
    u.ch[1]=2;
    u.ch[2]=0;
    u.ch[3]=0;
    printf("%d %d %d",u.ch[0],u.ch[1], u.i);
}

Выход: 3 2 515

Почему я получаю 515 за интерфейс? Может кто-нибудь объяснить, пожалуйста, об этом?

Ответы [ 2 ]

5 голосов
/ 23 декабря 2019

Отметьте это, система выделит 2 байта для объединения. Операторы u.ch[0]=3,u.ch[1]=2 хранят данные в памяти, как указано ниже.

image

Чтобы быть более понятным

u.ch[0]=3;
u.ch[1]=2;

Теперь пользовательский интерфейс рассчитывается как

(2)(3) in binary form which is equal to 515.

(2) --> 00000010; (3) --> 00000011

(2)(3) --> 0000001000000011 --> 515.

Надеюсь, этопоможет вам.

3 голосов
/ 23 декабря 2019

В результате вы получите 2 * 256 + 3 или 0x00000203. Это системно-зависимое поведение, разные системы имеют разные порядки байтов (и официально, вы не гарантированно получите действительное значение вообще для пользовательского интерфейса, хотя реализации, где вы не редки). Это связано с тем, что ваша система имеет прямой порядок байтов, поэтому байты располагаются в «обратном» порядке по сравнению с тем, как вы читаете число слева направо.

Наиболее распространенный альтернативный результат заключается в том, что в системах с прямым порядком байтоврезультат будет 0x03020000 или 50462720. В 16-разрядной системе с прямым порядком байтов это может быть 770;в том случае, когда int равен 64 битам (большинство 64-битных систем - нет), это может быть 216735732067205120, хотя я не уверен, что последние четыре байта будут обнулены, когда ваш элемент массива имеет только четыре записи.

Дополнительная информация: https://en.wikipedia.org/wiki/Endianness

...