Почему 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?
Другие вопросы по тегам