Когда был написан C89, неподписанные типы были достаточно новым дополнением к языку, в котором большой код использовал int
в тех местах, где unsigned
- как только он существовал - имел бы больше смысла.Авторы стандарта хотели обеспечить, чтобы функции, которые использовали более новый тип unsigned
, могли обмениваться данными с теми, которые были написаны для использования int
, поскольку unsigned
еще не существовало.
Стандарт немного неоднозначен относительно того, имеет ли тип, такой как unsigned*
, «соответствующий тип со знаком» int*
, или unsigned**
имеет «соответствующий тип без знака» int**
и т. Д. Учитывая цель разрешения взаимодействиямежду кодом, который предшествует неподписанным типам, и кодом, который их использует, создание функции, написанной для работы с последовательностями int*
, непригодной для клиентов с последовательностью unsigned*
, противоречило бы этой цели, а также уставу Комитета.Поддержка заявленной цели не потребует универсального использования int**
для доступа к объектам типа unsigned*
, но потребует, чтобы компиляторы с такими конструкциями, как:
unsigned *foo[10];
actOnIntPtrs((int**)foo, 10);
, распознавали, что вызываемая функция может влиять на объектытипа unsigned*
хранится в foo
.