Является ли 1u действительным С++?

Является, например,

size_t x = -1u;

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

действует?

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

-Jochen

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

size_t x = 0;
x--;

if ((x+1) == 0)

Ответ 4

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

Ответ 5

Скорее всего, вы хотите:

size_t x = -1ull;

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

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