Беззнаковые отрицательные примитивы? - PullRequest
7 голосов
/ 12 июня 2010

В C ++ мы можем создавать примитивы unsigned.Но они всегда позитивны.Есть ли способ сделать отрицательные переменные без знака?Я знаю, что слово без знака означает «без знака», поэтому также не знак минус (-).Но я думаю, что C ++ должен обеспечить это.

Ответы [ 5 ]

4 голосов
/ 12 июня 2010

Нет. unsigned может содержать только неотрицательные числа.

Если вам нужен тип, который представляет только отрицательные числа, вам нужно написать класс самостоятельно или просто интерпретировать значение как отрицательное в вашей программе.

(а зачем вам такой тип?)

2 голосов
/ 12 июня 2010

unsigned целые числа только положительные. Из пункта 3.9.1 пункта 3 стандарта С ++ 2003 года:

Диапазон неотрицательных значений целочисленный тип со знаком является поддиапазоном соответствующее целое число без знака тип и представление значения каждый соответствующий подписанный / неподписанный тип должен быть одинаковым.

Основное назначение целочисленных типов без знака - поддержка арифметики по модулю. С 3.9.1 абзац 4:

Целые числа без знака, объявленные без знака, подчиняется законам арифметики по модулю 2 n , где n - это количество бит в значении представление этого конкретного размера целого числа.

Вы свободны, конечно, относиться к ним как к отрицательным, если хотите, вам просто нужно как-то это отслеживать (возможно, с булевым флагом).

0 голосов
/ 10 июля 2011

Но я думаю, что C ++ должен обеспечить это.

Почему? Вы думаете, что C ++ должен предоставлять возможность делать неотрицательные числа отрицательными? Это глупо.

Беззнаковые значения в C ++ определены как неотрицательные. Они даже обертывают вокруг & mdash; а не недоношенный & ndash; в ноль! (И то же самое на другом конце диапазона)

0 голосов
/ 13 июня 2010

Не обманывайте себя по имени: unsigned часто неправильно понимают как неотрицательный, но правила для языка отличаются ... вероятно, лучшим именем было бы "bitmask" или "modulo_integer".

Если вы думаете, что unsigned неотрицателен, то, например, правила неявного преобразования являются полной бессмыслицей (почему разница между двумя неотрицательными должна быть неотрицательной? Почему сложение неотрицательных и целых чисел должно бытьнеотрицательно?).

Очень жаль, что стандартная библиотека C ++ сама попала в это недоразумение, потому что, например, vector.size () является неподписанным (абсурдно, если вы имеете это в виду, как сам язык в терминах битовой маски илиmodulo_integer).Этот выбор размеров больше связан со старыми 16-битными временами, чем с unsigned-ness, и, на мой взгляд, это был ужасный выбор, который мы все еще платим за ошибки.

0 голосов
/ 12 июня 2010

Я думаю, что вы думаете, что это неправильно.

Если вы хотите отрицательное число, то вы не должны объявлять переменную как беззнаковую.и вам нужен еще один бит, тогда вы можете использовать «больший» тип данных (например, int 64).

Тогда, если вы используете устаревший код, создание новой структуры может решить вашу проблему, но именно так из-за вашей конкретной ситуации C ++ не должен справляться с этим.

...