Почему ptrdiff_t подписан?
Если бы он был беззнаковым, он мог бы ссылаться на вдвое большее количество элементов. На моей машинеPTRDIFF_MAX
расширяется до9223372036854775807i64
, тогда какULLONG_MAX
является18446744073709551615Ui64
.
Я знаю, что эти ценности сами по себе огромны, но если
Тип (
ptrdiff_t
) выбирается таким образом, чтобы он мог хранить максимальный размер теоретически возможного массива любого типа.
тогда не имеет ли больше смысла делать это без знака?
1 ответ
Если
ptrdiff_t
были беззнаковыми, он мог бы ссылаться на вдвое большее количество элементов.
Это неправильно. Создание типа без знака не волшебным образом увеличивает количество информации, которую он может содержать. Целые числа со знаком и без знака одинакового размера имеют одинаковое количество различных состояний. В подписанной версии половина состояний представляет отрицательные числа. И вам нужны отрицательные числа для обработки результата вычитания указателя с более высоким значением адреса из указателя с более низким значением адреса. Например:
int arr[42];
int* p1 = arr;
int* p2 = arr + 42;
auto diff = p1 - p2; // what should the result be?