Re[9]: Остроконечные и тупоконечные слова
От: disputANT Украина  
Дата: 12.04.17 05:56
Оценка: 19 (3)
Здравствуйте, Ops, Вы писали:

Ops>Перевод должен упрощать чтение для тех, кому на английском не комфортно, а не ставить идиотские задачи по его расшифровке.


"Давайте спорить о вкусе омаров с теми, кто их ел". (с) Жванецкий

Не поленился, вчера сумел через третьи руки раздобыть текст этого раздела и даже набрал его

Остроконечные и тупоконечные слова

Из памяти может быть выбран один байт данных, но зачастую одновременно извлекается несколько последовательных байтов, образующих число. Например, в Microsoft Visual C++ значение типа int образуют четыре байта, считываемые из памяти вместе. Так как к памяти можно обращаться двумя способами, люди, которые проектируют компьютеры, должны ответить на важный вопрос: что содержится в первом байте (адрес которого наименьший) — старшие или младшие биты значения int?

На первый взгляд кажется, что это не должно иметь значения. Конечно, важно, чтобы все части компьютера одинаково считали, с какого конца int адрес меньше, иначе воцарится хаос. Вот в чем заключается разница между этими способами хранения. Если значение int, равное 0x01234567, хранится по адресам 1000–1003 и первым хранятся старшие биты, то по адресу 1000 содержится байт 0x01, а по адресу 1003 — байт 0x67, в то время как если сначала хранится младший байт, то по адресу 1000 содержится 0x67, а по адресу 1003 — 0x01. Компьютеры, которые хранят старшие биты в байте с младшим адресом, называются компьютерами с обратным порядком байтов ("тупоконечниками", big-endian). Компьютеры с прямым порядком байтов ("остроконечники", little-endian) сначала читают младшие биты. Итак, имеется два способа хранения целого числа (или указателя), и нет никаких причин предпочесть один другому, так что разные команды, работающие на разных процессорах для разных компаний, могут делать разный выбор.

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

Порядок байтов является лишь одной из причин, по которым C++ не определяет, как биты располагаются в int или как значение одного поля в объединении влияет на другие поля. Это одна из причин, по которым программу можно написать так, что она будет успешно работать на компьютере одного вида, но приводить к аварийному завершению на другом.

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.