2015-01-17 2 views
1

В C у меня есть массив символов, который я использую для хранения данных на уровне бит. Я храню эти массивы в файлах, а затем читаю их на машинах с разными архитектурами. Мой вопрос заключается в том, что порядок бит будет гарантированно согласован? Например, если я сохраняю «10010011» в первый байт, будут ли считанные смежные 1 всегда находиться в позициях 2^0 и 2^1, или они могут быть интерпретированы как 2^7 и 2^6 бит ?bit endianness и переносимость двоичных файлов C

EDIT: Я хочу немного разъяснить этот вопрос для людей, которые читают эту страницу позже. Байт-сущность - это порядок байтов в многобайтовом объекте, но я беспокоюсь о битах в заданном байте. Когда байт хранится на диске, он сохраняется как последовательность (обычно) 8 бит. Я не эксперт в области аппаратного обеспечения, но это должно как-то сводиться к этому. Итак, моя забота заключается в том, что способ, которым хранится байт, таков, что любая машина будет считывать исходное значение unsigned char, или если то, что от 3 до одной машины, будет 192 к другой. Я обеспокоен тем, что бит в конечном итоге будет перетасован. По-видимому, это не проблема, в соответствии с ответом, который я выбрал, а также одним из комментариев ниже. Благодарю.

+0

Я искренне надеюсь, что вы знаете, что C даже не пытается гарантировать размер байта, кроме как сказать, что он должен быть не менее 8 бит, как уступка архитектуре, которая не нравится 8-битным байтам что много ... – Deduplicator

+0

Спасибо за предупреждение, я полагаюсь на гарантию не менее 8 бит, поэтому бит более высокого порядка, если они есть, не должен вызывать никаких проблем. – Jack

+1

Если вы ограничиваете себя архитектурой с 8-битовым символом (все современные, за немногими исключениями, которые используют более высокую мощность-2), вы в порядке, если ограничиваете свой запрос чтением и записью 'unsigned char' и вручную (de-) сериализует все более сложное из них. Больше гарантий упростит и ускорит работу, хотя ... – Deduplicator

ответ

1

простой ответ:

Биты все еще будут в правильном порядке.

Однако, если преобразование любого формата за пределы% c, например,% d, будет определяться контентом архитектуры чтения, то бит в каждом байте будет по-прежнему совпадать.

+0

'% d' ничего не значит в этой ситуации. Если OP использует его для преобразования числового значения в печатное представление, endianness полностью выводится из изображения (хотя его заменяет «совместимость с текстовым представлением», что является аналогичной проблемой). – usr2564301

0

Endianness - порядка байтов, а не бит. Таким образом, 00001101 в машине с маленькими концами будет такой же в машине большого конца. Однако теперь вам нужно что-то о порядке бит в разных машинах. Изменение битов в союзах. Если вы собираетесь использовать union, прочитайте this, чтобы выяснить, как endistness влияет на битбитовую упаковку.

0

Концепция, о которой вы пытаетесь спросить, известна как bit-numbering or bit endianness, а системные архитектуры называются младшим или самым значительным битом (MSB, LSB).

Насколько я знаю, ссылка всегда относится к позиции 0-го или первого бита.

Что касается одного 8-разрядного байта или октета, он будет портативным, так что значение байта будет считаться равным 0x93 (147 десятичных знаков). Предполагая, что вы пишете битовую строку в качестве представления LSB с 0-м битом, это самый правый бит (норма для малочисленного процессора), как это обычно делают пользователи с левого и правого естественных языков, таких как английский.

Смежные вопросы