Перейти к содержанию
    

8 часов назад, ViKo сказал:

Я правильно понимаю, что такое объединение делать не стоит, потому что расположение битовых полей не гарантируется?

Если не считать проблему с возможным выравниванием многобайтовых полей, расположение бит однозначно, а в приведенном примере - и подавно. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, artemkad said:

расположение бит однозначно

Выходит, что нет. Тыц. Впрочем, там ссылка на тот же пункт, что привёл уважаемый @Arlleex. К слову лишь скажу, что использовал битовые поля, и проблем пока не было. При этом использовались IAR и GCC. Видимо, всё-таки логичнее делать сверху младшие биты, а внизу - старшие. Так сказать неформальный стандарт. Но на то он и неформальный, что ничего не гарантирует. Такие поля использовались у меня на Cortex-M4F (IAR) и AVR8 (GCC). Данные между микроконтроллерами передавались через последовательный интерфейс другу другу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Голосуйте, так сказать, рублём за нормальные решения.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 minutes ago, one_eight_seven said:

Пользуйтесь компилятором, а не ерундой всякой, и получите, то что:

Потрудитесь объяснить, что Вы имеете в виду.

7 minutes ago, one_eight_seven said:

Голосуйте, так сказать, рублём за нормальные решения.

И этот Ваш посыл неясен.

З.Ы. Компиляторы не я выбирал. Проекты мне передали. С AVR8 предпочитаю не связываться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки. Вас устравивает, что ваши структуры и битфилды будут отвечать ABI? Если да - то вам по пути с GCC и другими компиляторами, которые уважают ABI.

Если вам по нраву изменение поведения в любой момент, то можно пользоваться и другими комиляторами.

Изменено пользователем one_eight_seven

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, one_eight_seven said:

Хорошо. GCC явно заялвяют, что в этом плане они ориентируются на ABI, а не дают решения по желанию левой пятки.

Понятно. Если их ориентация сохраняется такой же для других платформ (мы же не только об армах говорим), то просто замечательно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, one_eight_seven сказал:

Пользуйтесь компилятором, а не ерундой всякой, и получите, то что...

Зависит все от того, что и под что пишется. Вот в протокольно-зависимых вещах, как я считаю, желательно писать без бит-полей (если планируется отдать исходники потом другому челу, который будет ими пользоваться на другой машине/архитектуре/под другими тулзами и т.д.). А вот какие-то флажки локальной бизнес-логики или логики драйвера упаковать - вполне себе нормально. Да даже в тех самых протокольных исходниках - думаю, можно, если ты стыкуешься сам с собой в плане разработки ПО.

На прошлой работе коллеги пишут под MIPS, так там и big endian, и порядок битовых полей от старшего к младшему. Ну и о чем речь?

Если известно на веки веков, что будешь пользоваться одном набором тулзов (например, GCC), то достаточно один раз "проверить" на деле, как в нем биты нумеруются и забыть. Потому что писать "универсальные" исходники под все что можно (и под все implementation-defined behavior фичи Си/компилятора) почти нереально, да и не нужно. А таких implementation-defined behavior в язкыке полно: я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический. Так что в ту же копилку - проверяю на своем компиляторе и дальше не парюсь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, Arlleex сказал:

я еще пользуюсь сдвигом вправо >> целых знаковых, полагая, что знак будет расширен (удобно для получения масок 0/-1, например), однако согласно стандарту Си, реализация определяет, какой сдвиг будет выполнен - арифметический или логический.

Разве?  :scratch_one-s_head:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И где в каком ABI определено распределение битовых полей от младшего бита к старшему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пользуюсь Keil uVision, поэтому все это описано в документации на tools: ARM Compiler Version 6.16 Reference Guide.
У ARM есть их стандарт AAPCS, в котором тоже их требования к работе с битовыми полями четко описаны. Полистайте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чудики. Есть конкретный нюанс. Это архитектура "Интел"/"Моторолла" LSB & MSB.  это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int  будут "чудеса" (ну это если не знать про lsb & msb).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Alex77 сказал:

это то как 32бита int располагается в памяти.

Ну прям откровение... Может потому топикстартер и не пользовался int-ом от слова совсем?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Alex77 сказал:

это то как 32бита int располагается в памяти. Посему сиё не сильно переносимо. И если это битовое чудо наложить на int  будут "чудеса" (ну это если не знать про lsb & msb).

В теме конкретный вопрос про объединение битовых полей с байтом - читайте первое сообщение. При чём здесь int и lsb/msb?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос был про то, с какого конца начинаются битовые поля, хоть в в байте, хоть в слове. Я уже набрал было нужное мне объединение (с использованием безымянных структур и объединений), скомпилировал, порадовался. А потом вспомнил... И переделал на битовые маски. Теперь это пройденный виток. ;-) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...