(Думаю, этот вопрос может относиться ко многим типизированным языкам, но я решил использовать в качестве примера C ++.)
Почему нет возможности просто написать:
struct foo {
little int x; // little-endian
big long int y; // big-endian
short z; // native endianness
};
указать порядок байтов для конкретных членов, переменных и параметров?
Сравнение с подписью
Я понимаю, что тип переменной не только определяет, сколько байтов используется для хранения значения, но и то, как эти байты интерпретируются при выполнении вычислений.
Например, каждое из этих двух объявлений выделяет по одному байту, и для обоих байтов каждая возможная 8-битная последовательность является допустимым значением:
signed char s;
unsigned char u;
но одна и та же двоичная последовательность может интерпретироваться по-разному, например 11111111
будет означать -1 при присвоении s
, но 255 при назначении u
. Когда знаковые и беззнаковые переменные участвуют в одном и том же вычислении, компилятор (в основном) заботится о правильных преобразованиях.
В моем понимании, порядок байтов - это просто вариант того же принципа: другая интерпретация двоичного шаблона, основанная на информации времени компиляции о памяти, в которой он будет храниться.
Кажется очевидным наличие этой функции в типизированном языке, допускающей низкоуровневое программирование. Однако это не является частью C, C ++ или любого другого языка, который я знаю, и я не нашел обсуждения этого в Интернете.
Обновлять
Я постараюсь обобщить некоторые выводы из множества комментариев, которые я получил в первый час после вопроса:
- подписанность является строго двоичной (либо со знаком, либо без знака) и всегда будет, в отличие от порядка байтов, который также имеет два хорошо известных варианта (большой и маленький), но также и менее известные варианты, такие как смешанный / средний порядок байтов. В будущем могут быть изобретены новые варианты.
- Порядок байтов имеет значение при побайтовом доступе к многобайтовым значениям. Есть много аспектов, помимо порядка байтов, которые влияют на структуру памяти многобайтовых структур, поэтому такой доступ в большинстве случаев не рекомендуется.
- C ++ нацелен на абстрактную машину и минимизирует количество предположений о реализации. . Эта абстрактная машина не имеет никакого порядка байтов.
Кроме того, теперь я понимаю, что подписывание и порядок байтов - не идеальная аналогия, потому что:
- Порядок байтов определяет только как что-то представляется в виде двоичной последовательности, но теперь что может быть представлено. И
big int
, иlittle int
будут иметь одинаковый диапазон значений. - подписанность определяет как биты и фактические значения сопоставляются друг с другом, но также влияет на то, что может быть представлено, например -3 не может быть представлен
unsigned char
и (при условии, чтоchar
имеет 8 бит) 130 не может быть представленsigned char
.
Таким образом, изменение порядка байтов некоторых переменных никогда не повлияет на поведение программы (за исключением побайтового доступа), тогда как изменение подписи обычно изменится.
char
имеет 8 бит. Это только минимум, а не фиксированное требование. Вы также предполагаете, что подписанная версия является дополнением до 2, но это совсем не обязательно. C / C ++ являются низкоуровневыми только в той степени, в которой это полезно для разработчиков спецификаций и практично для разработчиков; кроме того, они могут и должны использовать абстракцию так же широко, как и любой другой язык. Большинство программистов никогда не узнают и не позаботятся о порядке байтов, представлении знаков и т. Д .; они просто хотят, чтобы все происходило. - person underscore_d   schedule 28.11.2017[u]intN_t
типы точной ширины, которые должны быть дополнением до 2, если они существуют) - person underscore_d   schedule 28.11.2017big uint16_t
: это позволило бы отправлять структуры по сети, не беспокоясь о переносимости. Нет необходимости сначала сериализовать структуру, просто позвольте компилятору делать свое дело. ‹/Day-dream› - person cmaster - reinstate monica   schedule 29.11.2017