[C++] Битовые поля и объединения

  Рет қаралды 10,754

Efremov Engineer

Efremov Engineer

8 жыл бұрын

В этом видео я расскажу о том, как поместить несколько переменных в одной / одном байте. Как создать битовое поле и объединение переменных. Также Вы узнаете каким образом выделяется оперативная память под переменные и константы.
0:15 - Битовые поля
11:45 - Объединения
Задавайте Ваши вопросы:
Я в VK - id297086696
Я в FB - i2m.su/klotNf
Group VK - codrob
Group FB - i2m.su/xRPlWf
Бесплатный курс программирования: school.it2moro.ru/?...

Пікірлер: 28
@marianstychuk6419
@marianstychuk6419 7 жыл бұрын
8:30 когда ты дописывал 3 последних бита, система выровняла те 6 бит, которые уже были к 8и, и 3 бита записались уже во вторую "восьмерку" + потом 7 в 3ю восьмерку, так и получилось 3 байта т.е. система не может записать одну переменную в разные участки памяти
@efremov_engineer
@efremov_engineer 7 жыл бұрын
Да, Все верно
@GLOBALeVGENIUS
@GLOBALeVGENIUS 5 жыл бұрын
Спасибо за пояснение.
@snatvb
@snatvb 6 жыл бұрын
2:47 с каких пор 1111 = 16? я всегда думал, что это 15
@rinatinjapan6751
@rinatinjapan6751 5 жыл бұрын
yf 'njn vjvtynt dshe,bk dbltj
@GLOBALeVGENIUS
@GLOBALeVGENIUS 5 жыл бұрын
Спасибо за видео.
@jorapetrov6396
@jorapetrov6396 7 жыл бұрын
про упаковку структур тоже можно рассказать
@user-xi3ni6qd9t
@user-xi3ni6qd9t 5 жыл бұрын
за фейнта лайк
@user-iy5kd3tz3d
@user-iy5kd3tz3d 3 жыл бұрын
int a : 3 char b: 3 Выделяется 8 байт потому, что в структурах и классах есть такая особенность, если общее количество байт всех переменных в структуре например, не кратно наибольшему типу данных в ней, то операционная система добавляет необходимое количество байт, чтобы оно стало кратно наибольшему типу данных в структуре. В вашем случае 4 байта(int) + 1 байт(char) = 5 байт, что не кратно int a(4 байт), поэтому операционная система добавит еще 3 байта, то есть 8 байт, а 8 делится на 4, теперь все в порядке.
@jorapetrov6396
@jorapetrov6396 7 жыл бұрын
что за музыка играет?
@baget-info
@baget-info 7 жыл бұрын
2:17 сказали что в 1 бите 8 байт. Оговорка? или я что-то не так понял?
@efremov_engineer
@efremov_engineer 7 жыл бұрын
Разумеется оговорка :D
@mark.godman
@mark.godman 4 жыл бұрын
Респектую автору за видосы, но с понятиями битов и байтов ты немного "плаваешь". Или просто заговариваешься) А вообще, удачи в развитии канала!
@goldenglory8250
@goldenglory8250 4 жыл бұрын
Автор путает бит и байт (2.23).Надо исправить
@xavetar
@xavetar 7 жыл бұрын
Вопрос, почему выравненная переменная day, без типа unsigned выводит значения при day = 12, значение -4, а при значении day = 9, значение -7? CODE: #include #include using namespace std; #pragma pack(push, 1) struct date { unsigned int day : 6; unsigned int month:4; unsigned int year:12; bool d:1; }; #pragma pack(pop) int main(int argc, char* argv[], char* envp[]) { struct date * today = new date; today->month = 12; today->day = 25; today->year = 2004; printf("Today's date is %i/%i/%.2i. Sizeof date = %i. Sizeof today = %i. ", today->day, today->month, today->year, sizeof(date), sizeof(today)); delete today; system("PAUSE"); return 0; }
@user-iy5kd3tz3d
@user-iy5kd3tz3d 3 жыл бұрын
а ты не пробовал вместо printf, cout? Вообще C код лучше не использовать в С++
@xavetar
@xavetar 3 жыл бұрын
@@user-iy5kd3tz3d вовремя, через 3 года. Не помню, почему подобная проблема возникла. Вероятно при использовании unsigned бит, отводящийся под знак - не используется. Тогда как проблема видимо глубже. Ведь 6 бит информации это 64 значения, по 32 со знаком. 16 означает 10000 в двоичной системе и в нашем случае - это будет равно 0. Как будто выделенно 5 бит информации и "1" производит инверсию знака. Тогда как она 5 по счёту бит, а не 6. В итоге у нас остаётся по 16 знаковых значений с каждой стороны, что равно 32 = 2^5. В теории при следующей инверсии, когда 5 битый перевернётся в 0, у нас получится другое положительное значение, хотя должно быть отрицательное. Вероятно проблема кроется в разметке полей и где-то происходит выход за пределы, где в байте стоит единица. Более вероятным стечением обстоятельств является инверсия знака при достижении максимальной длины половины байта, 4 бит, где 5 бит становится "1", а 4 - "0", вследствие чего у нас доступна для чтения и записи всегда только половина байта и при использовании знаковых переменных, мы получаем в 2-раза меньше значений. Один из способов предотвращения подобной проблемы, ручное побитовое, двоичное преобразование в десятичную систему при использовании формулы преобразования значений из одной системы, в другую. И только в этом случае, мы получим правильное значение этого поля, при использовании числовых данных. Вероятно проблема может крыться и в printf, ведь при его использовании мы передаём тип int, а он равен 4 байтам. Cout наврятли разрешит данную проблему.
@xavetar
@xavetar 3 жыл бұрын
@@user-iy5kd3tz3d я как-то разрешил данную проблему, но это было 3 года назад.
@pavelneman8983
@pavelneman8983 7 жыл бұрын
на последней минуте в памятке, строка 30 - зарезервированно 12 байт. это 96 бит, не 128
@efremov_engineer
@efremov_engineer 7 жыл бұрын
Опечатка, видимо
@seledkaadekvat6618
@seledkaadekvat6618 4 жыл бұрын
видео сделано на от*бись. Автор собрался обьяснять про std::bitset не зная чем байт отличается от бита, и не понимающий что 32 в двоичной системе это (100000) а не (11111).
@marinamuceniece2415
@marinamuceniece2415 5 жыл бұрын
Путаете бит с байтом, музыка не уважение
@maximalyokhin2296
@maximalyokhin2296 4 жыл бұрын
1 бит = 8 байт, нуну...
@rortylama312
@rortylama312 6 жыл бұрын
Ля, музыка слишком громко, не смог понять все чисто ::::С
@gravity102
@gravity102 7 жыл бұрын
Очень много оговорок
@sarlevdiz
@sarlevdiz 7 жыл бұрын
Темы ты выбрал очень хорошие и есть что посмотреть. НО! Очень советую посмотреть (и поучиться у) западных блогеров. Во-первых, ужасная спешка. Вспомогательные функции почти не объясняются. Ну, типа тут нет ничего особенного пошли дальше. Приходится постоянно останавливать видео, чтобы рассмотреть код. Во-вторых, увеличь шрифт редактора. У людей разные экраны.
@l2pick
@l2pick 5 жыл бұрын
это очень плохо
@maximalyokhin2296
@maximalyokhin2296 4 жыл бұрын
1 бит = 8 байт, нуну...
[C++] Лямбда выражения
20:27
Efremov Engineer
Рет қаралды 10 М.
Идеально повторил? Хотите вторую часть?
00:13
⚡️КАН АНДРЕЙ⚡️
Рет қаралды 10 МЛН
[C++] STL: Set, Multiset, Unordered_set и Unordered_multiset
20:09
Efremov Engineer
Рет қаралды 7 М.
Битовые операции сдвига и поворота
26:16
Volodya Mozhenkov
Рет қаралды 7 М.
Зачем нужны указатели в C++?
8:14
Dima
Рет қаралды 11 М.
[C++] Функторы и предикаты
11:25
Efremov Engineer
Рет қаралды 6 М.