DEV Community

Amirshokh
Amirshokh

Posted on

Язык программирования Си. Глава(Chapter) 15

  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);)

#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");
}
Enter fullscreen mode Exit fullscreen mode

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

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay