Я рекомендую вам делать это именно так, как вы показали, так как это наиболее простой способ. Инициализировать, -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 будет работать с каждым типом и машиной.