Этот код может помочь вам понять, что происходит:
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 .