Вопрос по Си

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Ответить
Родился
Сообщения: 7
Зарегистрирован: Пт июл 22, 2016 11:31:21

Сообщение Icee »

Что делает эта строка?

Код: Выделить всё

bt[j] = (unsigned char) (x >> j*8);
Выражения в скобках перемножаются что ли?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

эта конструкция, если используется в цикле по j от 0 до 4 (например), заполнит массив bt байтами числа x (которое должно быть хотя бы типа int или больше).

по сути полный эквивалент более короткой (и наверняка более быстрой) записи *(long*)bt = x; (тут важно, чтобы размер массива bt был не менее sizeof(long)), естественно, эта запись в цикле не нуждается

разница между этими вариантами лишь в том, что исходный вариант от типа x не зависит, а предложенный мной - как уже сказал, зависит: тип приведения указателя bt должен совпадать с типом x или быть меньше его по размеру, но не больше!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Родился
Сообщения: 7
Зарегистрирован: Пт июл 22, 2016 11:31:21

Сообщение Icee »

Все, дошло до меня это заполнение. А (unsigned char) это оказывается насильственное назначение типа. Спасибо
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

а еще для такого рода задач существует замечательное ключевое слово union

Код: Выделить всё

union {long lg; char c[4];} bt;
bt.lg = x; 
ohmycode!
primuss3.com
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Теория»