Манипулирование переменной объединения в C - PullRequest
0 голосов
/ 26 февраля 2019

Вот объединение, содержащее два типа переменных int и char.Если мне присвоить какое-то значение переменной int, то что будет присутствовать в переменной char?

, например,

union a {
  int x;
  char j;
  char k;
} ua;
int main(){
  ua.x = 0xabcd;
  printf("%x",ua.j);
}

Вот какое значение будет напечатано и как?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Этот код может помочь вам понять, что происходит:

union a {
    int x;
    char j;
    char k;
}ua;

int main(){
    ua.x = 0xabcd;
    printf("%x\n",ua.x);    // Print x as hexadecimal:    abcd
    printf("%x\n",ua.j);    // Print j as hexadecimal:    ffffffcd
    printf("%x\n",ua.k);    // Print k as hexadecimal:    ffffffcd
    printf("%d\n",ua.x);    // Print x as decimal:        43981
    printf("%c\n",ua.j);    // Print j as char:           �
    printf("%c\n",ua.k);    // Print k as char:           �
}

При записи 0xabcd в int пространство памяти для int заполняется этим шестнадцатеричным числом (abcd), значение которого в десятичном виде является43981. Можно вывести оба значения с% x и% d соответственно.

Как сказал @Jonathan Leffler, j и k - это просто разные имена, которые ссылаются на один и тот же байт объединения.Вот почему% x печатает значение, оканчивающееся на «cd» (последний байт записанного значения, поскольку ваша система, похоже, использует большой порядок байтов) в обоих случаях.«Значение char» представляется как �.

Если вы хотите узнать, почему перед значением печатается ffffff, отметьте: Печать шестнадцатеричных символов в C .

0 голосов
/ 26 февраля 2019

Согласно стандарту C11:

6.2.6 Представления типов
6.2.6.1 Общие сведения
...
5 Определенные представления объекта не обязательно должны представлять значение типа объекта. Если сохраненное значение объекта имеет такое представление и читается выражением lvalue, которое не имеет символьного типа, поведение не определено .Если такое представление создается побочным эффектом, который изменяет весь или любую часть объекта выражением lvalue, которое не имеет символьного типа, поведение не определено.50) Такое представление называется представлением ловушек.

Но выражение lvalue здесь имеет тип char, так что это хорошо определенное поведение.

Также уместно это примечание от

6,5.2.3 Структура и члены объединения:
...
95) Если элемент, используемый для чтения содержимого объекта объединения, не совпадает с элементом, который последний раз использовался для хранения значения в объекте,соответствующая часть представления объекта значения повторно интерпретируется как представление объекта в новом типе, как описано в 6.2.6 (процесс, иногда называемый '' наказанием типа '').Это может быть представление ловушки

То, что на самом деле напечатает оператор printf, будет зависеть от порядкового номера системы, то есть он определен реализацией.

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