Порядок следования байтов 64 int64_t в 32-битных системах

Я хотел бы знать, имеют ли типы, которые больше, чем собственное машинное слово, и имеют поддержку абстракции компилятора, например int64_t в 32-битной системе, какую-либо спецификацию порядка байтов в памяти? Например, на машинах с прямым порядком байтов, должны ли мы предположить, что структура памяти представляет собой полный 64-битный порядок с перестановкой? Или это бесплатно быть средним порядком байтов, как PDP-11?

ср. http://en.wikipedia.org/wiki/Endianness#Middle-endian

Поскольку __int64 (MS) или long long (gcc) не были стандартными до int64_t в C99, не надумано ли предполагать что-либо о порядке байтов таких типов?

Спасибо


person v.oddou    schedule 01.11.2013    source источник
comment
Стандарт C и C++ ничего не указывает на порядок байтов в целых числах. Проверьте руководство по компилятору.   -  person Fred Foo    schedule 01.11.2013
comment
@larsmans: В частности, они даже не гарантируют согласованности между типами или даже внутри них. Middle-endian определенно разрешен.   -  person MSalters    schedule 01.11.2013


Ответы (3)


Зачем стандарту указывать порядок байтов в памяти чего-либо? Во всех случаях это зависит от компилятора/архитектуры. Если вас интересует конкретная архитектура, просто откройте отладчик и посмотрите, как ведет себя простая программа.

person shoosh    schedule 01.11.2013
comment
Потому что для сортировки разумно немного уточнить это. В стандарте может быть сказано: основные типы должны иметь согласованный порядок байтов в соответствии с собственной поддержкой платформы или настройкой страницы памяти. Таким образом, вы можете ожидать, что 64-битная компоновка будет такой же, как 32-битная, на той же странице (или на той же машине для машин с уникальным порядком байтов). Это дало бы сериализаторам (для сетевых или бинарных сохранений) немного более естественную переносимость их библиотек. - person v.oddou; 05.11.2013

C является переносимым языком и, как таковой, мало что говорит о фактическом представлении целочисленных типов. Стандарт даже позволяет использовать биты заполнения между битами значения! Дополнительные сведения см. в разделе 6.2.6.2 Целочисленные типы.

person diapir    schedule 01.11.2013
comment
Типы intN_t не могут иметь биты заполнения - person Timo; 01.11.2013
comment
@Timo: Верно и long long верно. Дело в том, что стандарт не предусматривает какой-либо схемы памяти. - person diapir; 01.11.2013

Я не думаю, что в стандарте C есть какая-либо спецификация порядка байтов. Это зависит от реализации. На практике я предполагал, что порядок байтов int64_t следует за порядком байтов архитектуры. Таким образом, даже в 32-битной программе хранение int64_t в памяти такое же, как если бы это была 64-битная программа. Но может потребоваться две инструкции для загрузки/сохранения данных, поскольку регистр 32-битный.

person tristan    schedule 01.11.2013
comment
Да, в этом суть вопроса :) Кажется естественным так думать, но это всего лишь моральный кодекс, которого составители компиляторов будут придерживаться при написании абстракции типа больших чисел. И при первых же невзгодах это соображение сменится на практичность. потому что никакая спецификация не держит их к этому. Отсюда мой страх. - person v.oddou; 05.11.2013