Является ли 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.