(Я предполагаю, что этот вопрос может применяться ко многим типизированным языкам, но я решил использовать С++ в качестве примера.)
Почему нет способа просто написать:
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, С++ или любого другого языка, который я знаю, и я не нашел никакого обсуждения об этом в Интернете.
Update
Я попытаюсь подытожить некоторые выдержки из многих комментариев, которые я получил в первый час после того, как спросил:
- Подпись
- строго двоичная (либо подписанная, либо без знака) и всегда будет, в отличие от endianness, которая также имеет два хорошо известных варианта (большой и маленький), но также и менее известные варианты, такие как смешанный/средний конец. Новые варианты могут быть изобретены в будущем.
- endianness имеет значение при обращении к многобайтовым значениям по байтам. Существует много аспектов, выходящих за рамки только суждения, которые влияют на макет памяти многобайтовых структур, поэтому этот вид доступа в основном обескуражен.
- С++ нацелен на таргетинг абстрактной машины и минимизирует количество предположений о реализации. Эта абстрактная машина не имеет никакого понятия.
Кроме того, теперь я понимаю, что подпись и сущность не являются идеальной аналогией, потому что:
- endianness только определяет, как что-то представляется как двоичная последовательность, но теперь то, что может быть представлено. Оба
big int
иlittle int
будут иметь тот же диапазон значений. Подпись - определяет, как биты и фактические значения сопоставляются друг с другом, но также влияет на то, что может быть представлено, например. -3 не может быть представлен
unsigned char
и (если предположить, чтоchar
имеет 8 бит) 130 не может быть представленsigned char
.
Таким образом, изменение сущности некоторых переменных никогда не изменило бы поведение программы (кроме байт-мутного доступа), тогда как изменение подписи обычно было бы.