Действителен ли -1u c ++? - PullRequest
       36

Действителен ли -1u c ++?

11 голосов
/ 06 декабря 2011

Допустим ли, например,

size_t x = -1u;

if (x == -1u)
    ...

?

Если это действительно так, это предотвратит предупреждение.конечно, в 32-битной системе x должно быть 0xffffffff, а в 64-битной системе это должно быть 0xffffffffffffffff.

-Jochen

Ответы [ 5 ]

7 голосов
/ 06 декабря 2011

1u имеет тип unsigned int. Затем это отменяется с помощью унарного оператора -. Поведение выглядит следующим образом:

Отрицательное значение беззнаковой величины вычисляется путем вычитания ее значения из 2 n , где n - количество битов в повышенном операнде (C ++ 11 5.3.1 / 8).

Таким образом,

-1u гарантированно предоставит вам наибольшее значение, представляемое unsigned int.

Чтобы получить наибольшее значение, представляемое произвольным типом без знака, вы можете привести -1 к этому типу. Например, для std::size_t рассмотрим static_cast<std::size_t>(-1).

5 голосов
/ 06 декабря 2011

Я всегда использовал ~ 0U с целью "без знака, все биты включены".

1 голос
/ 06 декабря 2011

Зависит от реализации поведение компилятора. Вы должны быть в состоянии сделать это, хотя:

size_t x = 0;
x--;

if ((x+1) == 0)
0 голосов
/ 06 декабря 2011

Скорее всего, это то, что вам нужно:

size_t x = -1ull;

if (x == -((size_t)-1ull))
    ...

x будет установлено в максимально возможное целое число, которое может содержать не все установленные биты.Для этого используйте ~ 0.

0 голосов
/ 06 декабря 2011

Хотя это технически действительный код , вы зависите от поведения, зависящего от реализации: обработка переполнения при преобразовании отрицательного числа в беззнаковое.Однако, если вам нужно сравнивать size_t с -1, потому что используемые вами вызовы API требуют этого, система уже испорчена, но ваш код, вероятно, будет работать, потому что им пришлось бы делать то же самое на другой стороне.API.

...