Ответ 1
Типы intptr_t
и uintptr_t
являются необязательными в ISO/IEC 9899: 1999 (C99), но там, где они реализованы, так же как и другие. Все подписанные типы имеют неподписанный аналог одного и того же размера и наоборот.
§7.18.1 Целочисленные типы
Если определены имена typedef, отличающиеся только отсутствием или наличием начального
u
, они должны обозначать соответствующие типы подписей и без знака, как описано в 6.2.5; реализация, обеспечивающая один из этих соответствующих типов, также должна обеспечивать другую....
§7.18.1.4 Целые типы, способные удерживать указатели объектов
Следующий тип обозначает целочисленный тип со знаком с тем свойством, что любой действительный указатель на void может быть преобразован в этот тип, а затем преобразован обратно в указатель на void, и результат сравним с исходным указателем:
intptr_t
Следующий тип обозначает целочисленный тип без знака с тем свойством, что любой действительный указатель на void может быть преобразован в этот тип, а затем преобразован обратно в указатель на void, и результат сравним с исходным указателем:
uintptr_t
Эти типы являются необязательными.
Обратите внимание, что в значении стандарта C функции не являются объектами; в стандарте C не гарантируется, что uintptr_t
может содержать указатель на функцию.
К счастью, POSIX делает шаг к спасению: он требует, чтобы указатели на объекты и указатели функций были одинакового размера.
2.12.3 Типы указателей
Все типы указателей функций должны иметь то же представление, что и указатель типа на
void
. Преобразование указателя функции вvoid *
не должно изменять представление. Значениеvoid *
, полученное в результате такого преобразования, может быть преобразовано обратно в исходный тип указателя функции с использованием явного приведения без потери информации.Примечание:
Стандарт ISO C не требует этого, но он необходим для соответствия POSIX.