Джеймс ответ, вероятно, правильный, но, конечно, описывает реализацию выбор, а не выбор, который вы можете сделать.
Лично я думаю, что адреса "интуитивно" не подписаны. Поиск указателя, который сравнивается с нулевым указателем, может показаться неправильным. Но ~0
и -1
для одного целого типа дают одинаковое значение. Если он интуитивно неподписан, ~0
может сделать более интуитивно понятным значение в особом случае - я использую его для беззнаковых целых случаев с ошибками довольно часто. Это не на самом деле отличается (ноль по умолчанию int, поэтому ~0
это -1
, пока вы не разыгрываете его), но он выглядит другим.
Указатели в 32-битных системах могут использовать все 32-битные BTW, хотя -1
или ~0
крайне маловероятно, чтобы указатель имел место для подлинного распределения на практике. Существуют также правила, специфичные для платформы - например, в 32-битной Windows процесс может иметь только 2 ГБ адресного пространства, и вокруг много кода, который кодирует какой-либо флаг в верхний бит указателя (например, для балансировки флаги в сбалансированных бинарных деревьях).