РАЗРЯДНАЯ СЕТКА

Программа

J L

J L

JL

J L

РАЗРЯДНАЯ СЕТКА

Битовые поля

Результат работы программы

Пример

Общая форма объявления объединения

union имя объединения

{

тип имя объекта 1; тип имя объекта 2;

тип имя объекта п; } имя переменной;

Видно, что объединение подобно структуре, однако в определённый момент времени может использоваться только один из элементов объединения. Объединения применяются для следующих целей:

1) для инициализации используемого объекта памяти, если в каждый момент времени только один из многих объектов является активным;

2) для интерпретации основного представления одного типа, как если бы этому объекту был присвоен другой тип.

Значение текущего элемента объединения теряется, когда другому элементу объединения присваивается значение.

 

 

 

#include <stdio.h>  
union data record { char s[4];  
 
int i;  
char c;  
} data;  
main () { printf("\пРазмер памяти под  
объединение data record
%d байт\п", sizeof(data));  
printf("\пАдреса переменных: \ns \t %p\n%i \t %p \n

%c \t %p \n", data.s,&data.i,&data.c]

Размер памяти под объединение data record 4 байт

Адреса переменных: s 0552 i 0552 с 0552

Используя структуры, можно упаковать целочисленные компоненты ещё более плотно, чем это было сделано с использованием массива. При упаковке целых объектов, как правило, допускается применять только беззнаковый тип unsigned int. Это обусловлено тем, что место, отводимое под объект, используется полностью, включая знаковый разряд.

В Си под объект типа unsigned int, как правило, отводится два байта памяти, т. е. 16 разрядов. Эти 16 разрядов (бит) можно разбить на битовые поля, каждое из которых выделяется для определенной переменной типа unsigned int. Пример размещения битового поля в оперативной памяти показан на рис. 1.10.

P^Tl P^Tir^Tl П^ПРГЯ1 ГГоЦпэ~пГ^Г1 ПП1 ГёЦr^Hn^Tl Г^ИГ^ИГП1


S





j



Рис. 1.10

Здесь под переменные / и s выделено по два бита памяти, под переменные р и к по три бита, под переменную j шесть бит. При работе с битовыми полями нужно внимательно следить за тем, чтобы значение переменной не потребовало памяти больше, чем под неё выделено.

Пример.Разработать программу, осуществляющую упаковку целых переменных i,j, k,p,SB битовые поля и вводящую на печать содержимое памяти, отведенной под эти переменные.


 

 

 

#include <stdio.h>  
struct field t { unsigned i :ype  
2;  
unsigned j 6;  
unsigned к 3;  
unsigned p 2;  
unsigned s 2;  
} my field;    
main () { my field.i    
= 3;  
my field.j = 20;  
my field.к = 2;  
my field.p = 1;  
my field.s = 0;  
printf("\n } my field = = %u \n", my field);

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


наш

15ЦГТ4] ЩЩ