Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

C - Битовые поля

Предположим, что ваша программа на языке C содержит ряд переменных TRUE/FALSE, сгруппированных в структуру, называемую статусом, следующим образом —

struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status;

Эта структура требует 8 байт памяти, но на самом деле мы будем хранить либо 0, либо 1 в каждой из переменных. Язык программирования C предлагает лучший способ использования памяти в таких ситуациях.

Если вы используете такие переменные внутри структуры, вы можете определить ширину переменной, которая сообщает компилятору C, что вы собираетесь использовать только это количество байтов. Например, приведенную выше структуру можно переписать следующим образом:

struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status;

Приведенная выше структура требует 4 байта памяти для переменной состояния, но только 2 бита будут использоваться для хранения значений.

Если вы будете использовать до 32 переменных, каждая из которых имеет ширину 1 бит, то структура состояния также будет использовать 4 байта. Однако, как только у вас будет 33 переменных, он выделит следующий слот памяти и начнет использовать 8 байт. Давайте проверим следующий пример, чтобы понять концепцию —

Живая демонстрация
#include <stdio.h>
#include <string.h>

/* define simple structure */
struct {
   unsigned int widthValidated;
   unsigned int heightValidated;
} status1;

/* define a structure with bit fields */
struct {
   unsigned int widthValidated : 1;
   unsigned int heightValidated : 1;
} status2;
 
int main( ) {
   printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
   printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
   return 0;
}

Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат —

Memory size occupied by status1 : 8
Memory size occupied by status2 : 4

Объявление битового поля

Объявление битового поля имеет следующую форму внутри структуры —

struct {
   type [member_name] : width ;
};

В следующей таблице описаны переменные элементы битового поля —

<тд>

тип

Целочисленный тип, определяющий, как интерпретируется значение битового поля. Тип может быть int, signed int или unsigned int.

<тд>

имя_участника

Имя битового поля.

<тд>

ширина

Количество битов в битовом поле. Ширина должна быть меньше или равна разрядности указанного типа.

Сер.№ Элемент и описание
1
2
3

Переменные, определенные с предопределенной шириной, называются битовыми полями. . Битовое поле может содержать более одного бита; например, если вам нужна переменная для хранения значения от 0 до 7, вы можете определить битовое поле шириной 3 бита следующим образом —

struct {
   unsigned int age : 3;
} Age;

Приведенное выше определение структуры указывает компилятору C, что переменная age будет использовать только 3 бита для хранения значения. Если вы попытаетесь использовать более 3 бит, то он не позволит вам это сделать. Давайте попробуем следующий пример —

Живая демонстрация
#include <stdio.h>
#include <string.h>

struct {
   unsigned int age : 3;
} Age;

int main( ) {

   Age.age = 4;
   printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
   printf( "Age.age : %d\n", Age.age );

   Age.age = 7;
   printf( "Age.age : %d\n", Age.age );

   Age.age = 8;
   printf( "Age.age : %d\n", Age.age );

   return 0;
}

Когда приведенный выше код скомпилирован, он скомпилируется с предупреждением, а при выполнении выдаст следующий результат —

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0

Язык C

  1. Побитовые операторы C# и операторы сдвига битов
  2. Типы пользовательских функций в программировании на C
  3. Передать массивы функции в C
  4. C-структуры и указатели
  5. Java это ключевое слово
  6. Инкапсуляция Java
  7. Структура С++ с примером
  8. С - Функции
  9. C - Переменные аргументы
  10. MATLAB — Интеграция