kochevkv 1 23 сентября Опубликовано 23 сентября · Жалоба Делаю заполнение хедера wav файла и возник такой вопрос. Нужно ли маскировать заполнение значений байтового массива? Я думаю что не надо uint8_t arr[24]; uint_fast32_t value = 0x0A0B0C0D; // Маска 0xFF arr[0] = value & 0xFF; arr[1] = ( value >> 8 ) & 0xFF; arr[2] = ( value >> 16 ) & 0xFF; arr[3] = ( value >> 24 ) & 0xFF; // Без маски arr[4] = value; arr[5] = value >> 8; arr[6] = value >> 16; arr[7] = value >> 24; Но есть ли в случае присвоения без маски 0xFF подводные камни? Мне тактов на маскирование не жалко, но любопытно как 100% правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 сентября Опубликовано 23 сентября · Жалоба 6 минут назад, kochevkv сказал: Но есть ли в случае присвоения без маски 0xFF подводные камни? Мне тактов на маскирование не жалко, но любопытно как 100% правильно. Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Если не совсем уж глупый. Советую хоть иногда заглядывать в листинг. PS: У вас же не DSP наверняка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября (изменено) · Жалоба 5 minutes ago, jcxz said: Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Советую хоть иногда заглядывать в листинг. Листинг листингу рознь. Мало ли что там один компилятор сделает и с какими опциями. Да, я что-то вообще тему создал не подумав. Я же все равно присваиваю байту в массиве 32 битное значение хоть и заполненное нулями после 8-го бита и ничего, не переживаю. Тему можно удалить) 5 minutes ago, jcxz said: Нету. "& 0xFF" не нужно. И скорее всего - ваш компилятор и так его выкидывает. Если не совсем уж глупый. Советую хоть иногда заглядывать в листинг. PS: У вас же не DSP наверняка. DSP. А что это меняет? Изменено 23 сентября пользователем kochevkv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 сентября Опубликовано 23 сентября · Жалоба 9 минут назад, kochevkv сказал: DSP. А что это меняет? Вообще-то при таких вопросах следует указывать - о каком CPU идёт речь? В обязательном порядке. Меняет это то, что во многих DSP не существует нативного байтового типа. И если у вас такой DSP, то непонятно - как именно реализован ваш uint8_t? В зависимости от его реализации, на таких DSP операция "& 0xFF" может быть необходима. При кривой реализации uint8_t. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября · Жалоба 1 minute ago, jcxz said: Вообще-то при таких вопросах следует указывать - о каком CPU идёт речь? В обязательном порядке. Меняет это то, что во многих DSP не существует нативного байтового типа. И если у вас такой DSP, то непонятно - как именно реализован ваш uint8_t? В зависимости от его реализации, на таких DSP операция "& 0xFF" может быть необходима. При кривой реализации uint8_t. Да не, не кривой у нас uint8_t 🙂 все как надо, 8 бит, всё как у людей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 23 сентября Опубликовано 23 сентября · Жалоба Значит не надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября · Жалоба 10 minutes ago, Arlleex said: Значит не надо. В нашем случае да, не надо. Но вот @jcxz нашел вариант когда надо. Но, насколько я понимаю, uint8_t не должен быть кривым. Т.е. он либо есть либо его нет. если нет, то надо использовать uint_least8_t и уже переписывать что есть. если б 9 битные байты встречались часто, то имело бы смысл сразу писать с маской чтобы не переписывать под разные платформы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 сентября Опубликовано 23 сентября · Жалоба 34 минуты назад, kochevkv сказал: Да не, не кривой у нас uint8_t 🙂 все как надо, 8 бит, всё как у людей А у DSP сколько бит? (минимальная разрядность обращения к памяти) Только что, kochevkv сказал: если б 9 битные байты встречались часто, то имело бы смысл сразу писать с маской чтобы не переписывать под разные платформы. Не "9-битные байты", а минимальная разрядность обращения к памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 23 сентября Опубликовано 23 сентября · Жалоба Если шины АЛУ позволяют работать с байтовым доступом, а в наборе инструкций есть однобайтовые инструкции, и компилятор их может использовать, то никаких проблем не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября (изменено) · Жалоба 22 minutes ago, jcxz said: А у DSP сколько бит? (минимальная разрядность обращения к памяти) 32 битный, Blackfin BF548. Но обращаться в программе к памяти могу и побайтно. Но листинг не смотрел ещё. Сейчас попробую. Нечетному элементу байтового массива напрямую присваивается, без дополнительных чтений и масок Изменено 23 сентября пользователем kochevkv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 23 сентября Опубликовано 23 сентября · Жалоба 22 минуты назад, jcxz сказал: А у DSP сколько бит? (минимальная разрядность обращения к памяти) Это пусть компилятор знает, Си-программе это зачем? Если бы ТС писал просто char, то еще понятно - он может быть разным. Но псевдонимы точной ширины, как uint8_t, компилятор должен знать как правильно обрабатывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Freibier 4 23 сентября Опубликовано 23 сентября · Жалоба 1 час назад, kochevkv сказал: в случае присвоения без маски 0xFF подводные камни? Если переменная, которой присваивается новое значение, объявлена как 8-ми битная, то не нужно никаких масок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября · Жалоба 47 minutes ago, jcxz said: Не "9-битные байты", а минимальная разрядность обращения к памяти. Я даже не знаю как этот параметр искать) я так понимаю, о таких особенностях отдельно пишут в даташите на первой странице. 8 бит должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 23 сентября Опубликовано 23 сентября · Жалоба 1 час назад, Arlleex сказал: Это пусть компилятор знает, Си-программе это зачем? Если бы ТС писал просто char, то еще понятно - он может быть разным. Но псевдонимы точной ширины, как uint8_t, компилятор должен знать как правильно обрабатывать. Про что я и говорил: 2 часа назад, jcxz сказал: непонятно - как именно реализован ваш uint8_t? Мы ведь исходников ТС не видели. И не знаем - как он там описал этот самый uint8_t. uint8_t - это не встроенный тип си. А значит может быть описан как угодно. 1 час назад, kochevkv сказал: Я даже не знаю как этот параметр искать) я так понимаю, о таких особенностях отдельно пишут в даташите на первой странице. 8 бит должно быть. Например у DSP семейства C55xx (TI) нет команд байтового обращения к памяти. Минимум = 16 бит. Да и вся память там - не пространство байт, а пространство 16-битных слов. Значит - как бы вы не описывали там этот самый uint8_t, он будет работать или посредством 16-битных обращений к памяти; или посредством операций чтения-модификации-записи. И то и другое может вызывать проблемы в определённых случаях. А искать надо в описании системы команд. Также можно обратить внимание на размер char в вашем компиляторе. Скорее всего его размер будет равен минимально-возможной ширине доступа к памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kochevkv 1 23 сентября Опубликовано 23 сентября (изменено) · Жалоба 2 hours ago, jcxz said: Мы ведь исходников ТС не видели. И не знаем - как он там описал этот самый uint8_t. uint8_t - это не встроенный тип си. А значит может быть описан как угодно. Не, я, конечно, его сам не описываю. Он в stdint.h описан как char. Еще и под #ifdef _BYTE_BITS == 8 (примерно, на память). Т.е. если бит не 8 то его и не будет вообще. Приставка std не значит что файл должен быть в стандарте? Изменено 23 сентября пользователем kochevkv Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться