Le recomiendo que lo haga exactamente como lo ha mostrado, ya que es el más sencillo. Inicialice a -1lo que funcionará siempre , independientemente de la representación de signo real, mientras ~que a veces tendrá un comportamiento sorprendente porque tendrá que tener el tipo de operando correcto. Solo así obtendrá el valor más alto de un unsignedtipo.
Para un ejemplo de una posible sorpresa, considere este:
unsigned long a = ~0u;
No almacenará necesariamente un patrón con todos los bits 1 en a. Pero primero creará un patrón con todos los bits 1 en un unsigned int, y luego lo asignará a a. Lo que sucede cuando unsigned longtiene más bits es que no todos son 1.
Y considere este, que fallará en una representación de complemento de no dos:
unsigned int a = ~0; // Should have done ~0u !
La razón de esto es que ~0tiene que invertir todos los bits. Invirtiendo que producirá -1en la máquina de complemento a dos (que es el valor que necesitamos!), Sino que no se dió -1en otra representación. En la máquina de complemento de uno, produce cero. Por lo tanto, en la máquina de complemento de uno, lo anterior se inicializará aa cero.
Lo que debe entender es que se trata de valores, no de bits. La variable se inicializa con un valor . Si en el inicializador modifica los bits de la variable utilizada para la inicialización, el valor se generará de acuerdo con esos bits. El valor que necesita para inicializar aal valor más alto posible es -1o UINT_MAX. El segundo dependerá del tipo de a- necesitará usar ULONG_MAXpara un unsigned long. Sin embargo, el primero no dependerá de su tipo, y es una buena manera de obtener el mayor valor.
Estamos no hablando de si -1tiene todos los bits de uno (que no siempre tiene). Y estamos no hablar acerca de si ~0tiene todos los bits (uno que tiene, por supuesto).
Pero de lo que estamos hablando es de cuál es el resultado de la flagsvariable inicializada . Y para ello, solo-1 funcionará con todo tipo y máquina.