Размещение битовых полей в памяти

От реализации зависит порядок размещения в памяти полей одной структуры. Поля могут размещаться как слева направо, так и справа налево. Любой код программ, использующий битовые поля, зависит от компьютера и компилятора.

Пример 2.

#include <stdio.h>

struct expl {

int i:2;

unsigned j:2;

int :2;

int k:2;

int dummy: 8;

} my;

void main() {

my.dummy = 0;

my.i = 1;

my.j = 3;

my.k = -1;

printf("%d\n", my);

printf("Поля: %d\t%d\t%d", my.i, my.j, my.k);

}

 

Следующий рисунок показывает, как выглядит переменная my в памяти.

 

   
dummy k   j i

 

Пример 3. Иллюстрация возможностей объединений и структур с битовыми полями.

В программе вводятся значения двух целых переменных m и n, и остатки от их деления на 16 заносятся соответственно в четыре младших и в четыре старших разряда одного байта. Таким образом, выполняется некоторая кодировка введенных значений переменных m и n. Затем печатается изображение содержимого сформированного байта.

Обратите внимание на использование объединения. В функции cod() запись данных производиться в элементы (битовые поля) структуры hh, входящей в объединение un, а результат выбирается из того же объединения un в виде одного байта. В функции binary() происходит обратное преобразование – в нее как значение параметра передается байт, содержимое которого побитово «расшифровывается» за счет обращения к отдельным полям структуры byte, входящей в объединение cod.

//Структуры, объединения и битовые поля

#include <stdio.h>

 

void binar (unsigned char); //прототип функции

unsigned char cod (int, int); // прототип функции

 

void main() {

unsigned char k;

int m, n;

printf("m=");

scanf("%d", &m);

printf("n=");

scanf("%d", &n);

k=cod(m,n);

printf("cod=%u\n", k);

binar(k);

}

//Упаковка в один байт остатков от деления на 16 двух целых чисел

unsigned char cod (int a, int b) {

union {

unsigned char z;

struct {

unsigned int x : 4;//младшие биты

unsigned int y : 4;//старшие биты

} hh;

} un;

un.hh.x=a%16;

un.hh.y=b%16;

return un.z;

}

 

//двоичное представление байта

void binar (unsigned char ch) {

union {

unsigned char ss;

struct {

unsigned a0 : 1;

unsigned a1 : 1;

unsigned a2 : 1;

unsigned a3 : 1;

unsigned a4 : 1;

unsigned a5 : 1;

unsigned a6 : 1;

unsigned a7 : 1;

} byte;

} cod;

cod.ss=ch;

printf("Номер битов: 7 6 5 4 3 2 1 0\n");

printf("Значение битов: %d %d %d %d %d %d %d %d\n",

cod.byte.a7, cod.byte.a6, cod.byte.a5, cod.byte.a4,

cod.byte.a3, cod.byte.a2, cod.byte.a1, cod.byte.a0);

}

Результат выполнения программы:

Первый вариант

m=1

n=3

cod=49

Номер битов: 7 6 5 4 3 2 1 0

Значение битов: 0 0 1 1 0 0 0 1

Второй вариант

m=0

n=1

cod=16

Номер битов: 7 6 5 4 3 2 1 0

Значение битов: 0 0 0 1 0 0 0 0

Задания

1.Наберите коды программ из Примеров 1 и 2. Выполните компиляцию и запуск программ.

2.Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений. Структура Магазин: Наименование товара, Цена, Страна производства, Наличие в магазине, Соответствие стандарту РФ, Является товаром месяца. Объявите и заполните массив из пяти структур. Распечатайте информацию обо всех введенных товарах. Распечатайте информацию об имеющихся в магазине товарах, не соответствующих стандарту РФ.

3.Используя объединение с битовыми полями, определите четность беззнакового целого числа по анализу старшего бита (операцию деления с остатком не использовать).

Домашние задания

1.Наберите код программы из Примера 3. Выполните компиляцию и запуск программы.

2.Разработайте структуру, используя битовые поля для обозначения логических (битовых) значений. Структура Военкомат: Фамилия, Имя, Отчество, Год рождения, Гражданство, Военнообязанный, Наличие отсрочки от службы в ВС, Годен к службе в ВС. Объявите и заполните массив из пяти структур. Распечатайте весь массив. Распечатайте информацию обо всех военнообязанных гражданах РФ, годных к службе в ВС.

3.Используя объединение с битовыми полями, определите кратность 8 беззнакового целого числа по анализу старших битов (операцию деления с остатком не использовать).









Дата добавления: 2015-02-16; просмотров: 875;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.007 сек.