Le recomiendo que lo haga exactamente como lo ha mostrado, ya que es el más sencillo. Inicialice a -1
lo 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 unsigned
tipo.
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 long
tiene 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 ~0
tiene que invertir todos los bits. Invirtiendo que producirá -1
en la máquina de complemento a dos (que es el valor que necesitamos!), Sino que no se dió -1
en 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á a
a 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 a
al valor más alto posible es -1
o UINT_MAX
. El segundo dependerá del tipo de a
- necesitará usar ULONG_MAX
para 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 -1
tiene todos los bits de uno (que no siempre tiene). Y estamos no hablar acerca de si ~0
tiene todos los bits (uno que tiene, por supuesto).
Pero de lo que estamos hablando es de cuál es el resultado de la flags
variable inicializada . Y para ello, solo-1
funcionará con todo tipo y máquina.