artemkad 77 28 декабря, 2021 Опубликовано 28 декабря, 2021 · Жалоба 8 часов назад, ViKo сказал: Я правильно понимаю, что такое объединение делать не стоит, потому что расположение битовых полей не гарантируется? Если не считать проблему с возможным выравниванием многобайтовых полей, расположение бит однозначно, а в приведенном примере - и подавно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 8 hours ago, artemkad said: расположение бит однозначно Выходит, что нет. Тыц. Впрочем, там ссылка на тот же пункт, что привёл уважаемый @Arlleex. К слову лишь скажу, что использовал битовые поля, и проблем пока не было. При этом использовались IAR и GCC. Видимо, всё-таки логичнее делать сверху младшие биты, а внизу - старшие. Так сказать неформальный стандарт. Но на то он и неформальный, что ничего не гарантирует. Такие поля использовались у меня на Cortex-M4F (IAR) и AVR8 (GCC). Данные между микроконтроллерами передавались через последовательный интерфейс другу другу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 29 декабря, 2021 Опубликовано 29 декабря, 2021 (изменено) · Жалоба 58 minutes ago, haker_fox said: Выходит, что нет. Тыц. Впрочем, там ссылка на тот же пункт, что привёл уважаемый @Arlleex. К слову лишь скажу, что использовал битовые поля, и проблем пока не было. При этом использовались IAR и GCC. Видимо, всё-таки логичнее делать сверху младшие биты, а внизу - старшие. Так сказать неформальный стандарт. Но на то он и неформальный, что ничего не гарантирует. Такие поля использовались у меня на Cortex-M4F (IAR) и AVR8 (GCC). Данные между микроконтроллерами передавались через последовательный интерфейс другу другу. Пользуйтесь компилятором, а не ерундой всякой, и получите, то что: Quote Yeah, the GCC, for instance, specifically notes that bitfields are arranged as per the ABI, not the implementation Голосуйте, так сказать, рублём за нормальные решения. Изменено 29 декабря, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 7 minutes ago, one_eight_seven said: Пользуйтесь компилятором, а не ерундой всякой, и получите, то что: Потрудитесь объяснить, что Вы имеете в виду. 7 minutes ago, one_eight_seven said: Голосуйте, так сказать, рублём за нормальные решения. И этот Ваш посыл неясен. З.Ы. Компиляторы не я выбирал. Проекты мне передали. С AVR8 предпочитаю не связываться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
one_eight_seven 6 29 декабря, 2021 Опубликовано 29 декабря, 2021 (изменено) · Жалоба Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки. Вас устравивает, что ваши структуры и битфилды будут отвечать ABI? Если да - то вам по пути с GCC и другими компиляторами, которые уважают ABI. Если вам по нраву изменение поведения в любой момент, то можно пользоваться и другими комиляторами. Изменено 29 декабря, 2021 пользователем one_eight_seven Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 21 minutes ago, one_eight_seven said: Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки. Понятно. Если их ориентация сохраняется такой же для других платформ (мы же не только об армах говорим), то просто замечательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 3 часа назад, one_eight_seven сказал: Пользуйтесь компилятором, а не ерундой всякой, и получите, то что... Зависит все от того, что и под что пишется. Вот в протокольно-зависимых вещах, как я считаю, желательно писать без бит-полей (если планируется отдать исходники потом другому челу, который будет ими пользоваться на другой машине/архитектуре/под другими тулзами и т.д.). А вот какие-то флажки локальной бизнес-логики или логики драйвера упаковать - вполне себе нормально. Да даже в тех самых протокольных исходниках - думаю, можно, если ты стыкуешься сам с собой в плане разработки ПО. На прошлой работе коллеги пишут под MIPS, так там и big endian, и порядок битовых полей от старшего к младшему. Ну и о чем речь? Если известно на веки веков, что будешь пользоваться одном набором тулзов (например, GCC), то достаточно один раз "проверить" на деле, как в нем биты нумеруются и забыть. Потому что писать "универсальные" исходники под все что можно (и под все implementation-defined behavior фичи Си/компилятора) почти нереально, да и не нужно. А таких implementation-defined behavior в язкыке полно: я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический. Так что в ту же копилку - проверяю на своем компиляторе и дальше не парюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 54 минуты назад, Arlleex сказал: я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический. Разве? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба 3 часа назад, jcxz сказал: Разве? К сожалению, да (п. 6.5.7 Bitwise shift operators) Цитата 5 The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined. P.S. О, даже без уточнения насчет арифметического/логического. Но, думаю, в данном случае другого не дано. Для ARM Compiler 6 Цитата The results of some bitwise operations on signed integers (6.5). In the bitwise right shift E1 >> E2, if E1 has a signed type and a negative value, the value of the result is the integral part of the quotient of E1 / 2^E2, except that shifting the value –1 yields result –1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба И где в каком ABI определено распределение битовых полей от младшего бита к старшему? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 29 декабря, 2021 Опубликовано 29 декабря, 2021 · Жалоба Я пользуюсь Keil uVision, поэтому все это описано в документации на tools: ARM Compiler Version 6.16 Reference Guide. У ARM есть их стандарт AAPCS, в котором тоже их требования к работе с битовыми полями четко описаны. Полистайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 3 января, 2022 Опубликовано 3 января, 2022 · Жалоба Чудики. Есть конкретный нюанс. Это архитектура "Интел"/"Моторолла" LSB & MSB. это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int будут "чудеса" (ну это если не знать про lsb & msb). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
artemkad 77 3 января, 2022 Опубликовано 3 января, 2022 · Жалоба 3 часа назад, Alex77 сказал: это то как 32бита int располагается в памяти. Ну прям откровение... Может потому топикстартер и не пользовался int-ом от слова совсем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 4 января, 2022 Опубликовано 4 января, 2022 · Жалоба 9 часов назад, Alex77 сказал: это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int будут "чудеса" (ну это если не знать про lsb & msb). В теме конкретный вопрос про объединение битовых полей с байтом - читайте первое сообщение. При чём здесь int и lsb/msb? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 4 января, 2022 Опубликовано 4 января, 2022 · Жалоба Вопрос был про то, с какого конца начинаются битовые поля, хоть в в байте, хоть в слове. Я уже набрал было нужное мне объединение (с использованием безымянных структур и объединений), скомпилировал, порадовался. А потом вспомнил... И переделал на битовые маски. Теперь это пройденный виток. ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться