Когда был написан стандарт C, для машин было характерно иметь 16-битный тип int и быть неспособным обрабатывать любой отдельный объект размером более 65535
байтов, но, тем не менее, может обрабатывать объекты размером более 32767 байтов.
Поскольку арифметика без знака int будет достаточно большой, чтобы обрабатывать самые большие
размер таких объектов, но арифметика со знаком int не будет, size_t был определен
быть без знака, чтобы размещать такие объекты без необходимости использовать «длинный»
вычисления.
На машинах, где максимально допустимый размер объекта находится между INT_MAX и
UINT_MAX, разница между указателями на начало и конец такого
объект может быть слишком большим, чтобы поместиться в "int". Пока Стандарт не навязывает
любые требования к тому, как реализации должны справляться с этим, общий подход
это определить поведение целочисленного типа и указателя обтекания так, что если S и E
указатели на начало и конец символа [49152], тогда даже если E-S
будет превышать INT_MAX, это даст значение, которое, при добавлении к S, будет
доходность Е.
В настоящее время редко когда есть какое-либо реальное преимущество в том, что size_t является
тип без знака (так как код, которому нужны объекты размером более 2 ГБ, часто
нужно использовать 64-битные указатели по другим причинам), и это вызывает много видов
Сравнения, включающие размеры объектов, ведут себя нелогично, но
Тот факт, что sizeof выражений дает тип без знака, достаточно хорошо
Укоренилось, что это вряд ли когда-либо изменится.