Поскольку char
- это наименьшая адресуемая единица в C, если вы сделали char
больше 8 битов, было бы сложно или невозможно написать реализацию сокетов, как вы сказали.Все сети работают на CHAR_BIT == 8
машинах.Итак, если вы должны были отправить сообщение с компьютера, на котором CHAR_BIT == 9
, на компьютер с CHAR_BIT == 8
, что библиотека сокетов должна делать с дополнительным битом?На этот вопрос нет разумного ответа.Если вы усекаете бит, тогда становится трудно указывать даже что-то столь же простое, как буфер для клиента кода сокетов - «Это массив символов, но вы можете использовать только первые 8 бит», что было бы неразумно в такой системе,Более того, переход от 8-битных систем к 9-битным будет той же проблемой - как система сокетов будет делать с этим дополнительным битом?Если он устанавливает этот бит на ноль, представьте, что происходит с кем-то, кто помещает int
в провод.Чтобы заставить его работать правильно, вам нужно было сделать все виды мерзких битовых масок на 9-битной машине.
Наконец, поскольку 99,9% машин используют 8-битные символы, это не такое уж большое ограничение.Большинство машин, которые используют CHAR_BIT != 8
, также не имеют виртуальной памяти, что в любом случае исключит их из POSIX-совместимости.
Когда вы работаете на одной машине (как предполагает стандарт C), вы можете делать что-токак быть CHAR_BIT
агностиком, потому что обе стороны того, что может читать или записывать данные, сходятся в том, что происходит.Когда вы вводите что-то вроде сокетов, где задействовано более одной машины, они ДОЛЖНЫ согласовывать такие вещи, как размер символа и порядковый номер.(Endinanness в значительной степени просто стандартизирован для Big Endian на проводе, так как гораздо больше архитектур отличаются по порядку байтов, чем по размеру байта)