Язык программирования Си. Глава(Chapter) 15
Published: 2022-06-24 17:58:54

1. Байт или октет пронумерован справа налево от 0. Нулевой бит — младший(low-order bit), а седьмой старший(high-order bit)

2. Представление двоичных целых чисел со знаком(Signed Integers) и без знака(Integers) — методами величины со знаком(sign-magnitude), дополнения до двух(two’s-complement) и дополнения до единицы(one’s-complement) — также чисел с плавающей точкой(Floating Point), зависящее от оборудования, но не от C

3. Двоичная(Binary), восьмеричная(Octal) и шестнадцатеричная(Hexadecimal) системы счисления(Number Bases)

4. Побитовые(Bitwise) логические(Logical) и сдвигающие(Shift) операции и их синонимы в iso646.h: ~(compl), &(bitand), |(bitor), ^(xor), &=(and_eq), |=(or_eq), ^=(xor_eq), >>(сдвиг вправо, освободившиеся биты устанавливаются в зависимости от системы или 0 если значение беззнаковое), <<(сдвиг влево, освободившиеся биты устанавливаются в 0), >>=, <<=

5. Манипулирование битами(Bit Fiddling): наложение маски(Masks) обычно равную ширине маскируемого значения — flags &= МАSК;, включение(установка) и выключение(очистка) битов(Turning Bits On (Setting Bits) and Off (Clearing Bits)) — flags |= MASK; и flags &= ~MASK;, переключение битов(Toggling Bits) — flags ^= MASK; и проверка значения бита(Checking the Value of a Bit) — (flags & MASK) == MASK;

6. Битовые поля(Bit Fields) в структурах(где поля записываются сверху вниз справа налево): их объявление(struct tag { type member : width; };), ширина(должна быть целочисленного типа или по умолчанию устанавливаются в unsigned int), стандартная инициализация(при присваивании большего значения оно усекается в соответствии с шириной поля), заполнение(padding) неименованными промежутками(type : width;) и в частности неименованный промежуток с нулевой шириной для выравнивания по следующей области определённого типа(type member1 : width; type : 0; type member2 : width;), также автоматическое выравнивание(сохранение перекрывающего поля в следующей смежной области хранения типа поля) при превышении общего количества объявленных битов размера определённого типа при котором остаётся неименованный промежуток(int code1 : 24; int code2 : 24;), другие синтаксические правила(нельзя: struct { char ch : 9; };, struct { char ch : 0; }; и &identifier.bit_field;) и отсутствие гарантии переносимости(portability) из-за отличий работы с полями различных систем

7. Взаимозаменяемость побитовых операций(в преимуществе переносимость) и битовых полей(в преимуществе удобный синтаксис) 

8. Средства выравнивания(Alignment Features) в C11(процессоры читают по 2-4-8 байтов, поэтому нужно выровнять переменные в соответствии с их размером) и их псевдонимы в stdalign.h: _Alignas(alignas) — запрос конкретного выравнивания для переменной или типа(_Alignas(double) char c1;, _Alignas(8) char с2; или unsigned char _Alignas(long double) c_arr[sizeof(long double)];) и _Alignof(alignof) — выдача требования к выравниванию указанного типа(size_t float_align = _Alignof(float);)

```c
#include <stdio.h>
#include <stdint.h>

union data_union {
    uint64_t data_var;
    struct data_struct {
        unsigned char _Alignas(_Alignof(uint32_t)) a;
        unsigned char _Alignas(uint16_t) b;
        uint16_t c : 4;
        uint16_t d : 4;
        uint16_t e;
    } data_struct;
} data_union = { .data_struct = 1, 2, 3, 4, 5 };

int main(void)
{
    uint64_t var = 0x0005004300020001;
    if (data_union.data_var == var)
        puts("Statement is true");
    else
        puts("Statement is false");
}
```

> Язык программирования Си 6 издание. Стивен Прата
> C Primer Plus 6th edition. Stephen Prata