Я рекомендую вам делать это именно так, как вы показали, так как это наиболее простой способ. Инициализировать, -1
который будет работать всегда , независимо от фактического представления знака, но ~
иногда будет иметь удивительное поведение, потому что вам потребуется правильный тип операнда. Только тогда вы получите самое высокое значение unsigned
типа.
В качестве примера возможного сюрприза рассмотрим этот:
unsigned long a = ~0u;
Он не обязательно сохранит шаблон со всеми битами 1 a
. Но сначала он создаст шаблон со всеми битами 1 в элементе unsigned int
, а затем назначит его a
. Что происходит, когда unsigned long
битов больше, так это то, что не все из них равны 1.
И рассмотрим этот вариант, который не сработает на представлении дополнения, отличном от двух:
unsigned int a = ~0; // Should have done ~0u !
Причина в том, что ~0
нужно инвертировать все биты. Инвертирование, которое даст результат -1
на машине с дополнением до двух (что нам и нужно!), Но не даст результата -1
на другом представлении. На машине с дополнением до единицы это дает ноль. Таким образом, на машине с дополнением до единицы указанное выше будет инициализировано a
нулем.
Вы должны понимать, что все дело в значениях, а не в битах. Переменная инициализируется значением . Если в инициализаторе вы измените биты переменной, используемой для инициализации, значение будет сгенерировано в соответствии с этими битами. Значение, необходимое для инициализации a
максимально возможным значением, - это -1
или UINT_MAX
. Второй будет зависеть от типа a
- вам нужно будет использовать ULONG_MAX
для unsigned long
. Однако первый не будет зависеть от его типа, и это хороший способ получить наибольшее значение.
Мы не говорим о том -1
, все ли биты равны единице (не всегда). И мы не говорим о том ~0
, все ли биты едины (конечно, есть).
Но мы говорим о том, каков результат инициализированной flags
переменной. И для этого, только-1
будет работать с каждым типом и машиной.