Пример1
#include <stdio.h>
union Example
{ int i:2;
int j:9;
};
int main(void)
{
union Example ex;
ex.j=15;
printf("%d",ex.i);
printf("\nSize of Union : %lu\n" , sizeof(ex));
return 0;
}
Вывод:
-1
Size of Union : 4
Наблюдения:
Из этого вывода мы можем сделать вывод, что даже если мы используем 9 бит (макс.), Компилятор выделяет 4 байта (из-за заполнения).Оператор union Example ex;
выделяет 4 байта памяти для объекта Пример Пример.Оператор ex.j=15;
назначает 0x0000000F этим 4 байтам памяти.Таким образом, для j он выделяет 0-0-0-0-0-1-1-1-1 для 9 битов.Оператор printf("%d",ex.i);
пытается напечатать ex.i (что составляет 2 бита).У нас есть 1-1 из предыдущего оператора.
Здесь есть интересная часть, ex.i имеет тип подписанного int.Следовательно, первый бит используется для назначения подписанного представления, и большинство процессоров делает подписанное представление в форме дополнения до 2.Поэтому, если мы сделаем обратное дополнение 2 к 1-1, мы получим значение 1. Таким образом, мы получим выходное значение -1.
Example2
#include <stdio.h>
union Example
{ unsigned int i:2;
int j:9;
};
int main(void)
{
union Example ex;
ex.j=15;
printf("%d",ex.i);
return 0;
}
Вывод:
3
Наблюдения:
Оператор union Example ex;
выделяет 4 байта памяти для объекта-примера Union ex.Оператор ex.j=15;
назначает 0x0000000F этим 4 байтам памяти.Таким образом, для j он выделяет 0-0-0-0-0-1-1-1-1 для 9 битов.оператор printf("%d",ex.i);
пытается напечатать ex.i (что составляет 2 бита).У нас есть 1-1 из предыдущего оператора.
То же, что и в примере выше, но здесь ex.i имеет тип unsigned int.Следовательно, здесь не используется бит со знаком для представления.Поэтому все, что хранится в 2-битном расположении, является точным значением.Следовательно, результат равен 3.
Надеюсь, я очистил ваши сомнения.Пожалуйста, проверьте на 2 и 1 дополнения в Интернете.