4.7 Массивы и указатели
- Результат преобразования указателя в целое или наоборот (C90 6.3.4, C99 и C11 6.3.2.3).
При преобразовании указателя в целое значение отбрасываются старшие биты, если представление указателя больше, чем тип целого; происходит знаковое расширение2, если представление указателя меньше, чем тип целого; в противном случае биты остаются неизменными.
При преобразовании целого значения в указатель отбрасываются старшие биты, если представление указателя меньше, чем тип целого; происходит расширение в соответствии со знаком типа целого, если представление указателя больше, чем тип целого; в противном случае биты остаются неизменными.
При преобразовании указателя в целое и обратном преобразовании полученный указатель должен ссылаться на тот же объект, что и исходный указатель; в противном случае поведение не определено. То есть нельзя использовать арифметику целых чисел для избежания неопределенного поведения арифметики указателей, как предписано в C99 и C11 6.5.6/8.
- Размер результата вычитания двух указателей на элементы одного массива (C90 6.3.6, C99 и C11 6.5.6).
Значение определяется стандартом, а тип определяется ABI.
Примечания
Будущие версии GCC могут использовать расширение до нуля или использовать определенный для целевой системы шаблон ptr_extend. Не полагайтесь на знаковое расширение.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/Arrays-and-pointers-implementation.html