Упорядочение байтов
Байты в слове могут нумероваться слева направо или справа налево. На первый взгляд может показаться, что между этими двумя вариантами нет разницы, но мы скоро увидим, что выбор имеет большое значение. На рис. 2.9, а изображена область памяти 32-разрядного компьютера, в котором байты пронумерованы слева направо (как у компьютеров SPARC или мэйнфреймов IBM). На рис. 2.9, б показана аналогичная область памяти 32-разрядного компьютера с нумерацией байтов справа налево (как у компьютеров Intel). В первой из этих систем нумерация начинается с высшего порядка, в связи с чем она относится к категории компьютеров с прямым порядком следования байтов (big endian) — в противоположность системам с обратным порядком следования байтов (little endian) (рис. 2.9, а). Между прочим, эти термины («big endian» и «little endian») заимствованы из «Путешествий Гулливера» Свифта — он, как мы помним, иронизировал по поводу спора политиков о том, с какого конца нужно разбивать яйца. Впервые они были введены в научный оборот в виртуозной статье Коэна [45].
Рис. 2.9. Память с прямым порядком следования байтов (а); память с обратным порядком следования байтов (б)
Важно понимать, что в обеих системах 32-разрядное целое число (например, 6) представлено битами 110 в трех крайних правых битах слова, а остальные 29 бит представлены нулями. Если байты нумеруются слева направо, биты 110 находятся в байте 3 (или 7, или 11 и т. д.). Если байты нумеруются справа налево, биты 110 находятся в байте 0 (или 4, или 8 и т. д.). В обеих системах слово, содержащее это целое число, имеет адрес 0.
Если компьютеры содержат только целые числа, никаких сложностей не возникает. Однако многие прикладные задачи требуют использования не только целых чисел, но и цепочек символов и других типов данных. Рассмотрим, например, простую запись данных о персонале, состоящую из строки (имя сотрудника) и двух целых чисел (возраст и номер отдела). Строка завершается одним или несколькими нулевыми байтами, призванными заполнить слово целиком. На рис. 2.10, а для записи «Jim Smith, 21 год, отдел 260» (1 х 256 + 4 = 260) представлена схема с нумерацией байтов справа налево, а на рис. 2.10, б — с нумерацией байтов слева направо.
Рис. 2.10. Запись данных о сотруднике для машины с прямым порядком следования байтов (а); та же запись для машины с обратным порядком следования байтов (б); результат передачи записи с машины с прямым порядком следования байтов на машину с обратным порядком следования байтов (в); результат перестановки байтов в предыдущем случае (г)
Оба этих представления хороши и внутренне последовательны. Проблемы начинаются тогда, когда один из компьютеров пытается переслать запись на другой компьютер по сети. Предположим, что машина с нумерацией байтов слева направо пересылает запись на компьютер с нумерацией байтов справа налево по одному байту, начиная с байта 0 и заканчивая байтом 19. Для простоты будем считать, что биты не инвертируются при передаче. Таким образом, байт 0 переносится из первой машины на вторую в байт 0 и т. д., как показано на рис. 2.10, в.