Tenía curiosidad por saber qué pasaría si le asigno un valor negativo a una variable sin firmar.
El código se parecerá a esto.
unsigned int nVal = 0;
nVal = -5;
No me dio ningún error de compilación. ¡Cuando ejecuté el programa, nVal
se le asignó un valor extraño! ¿Podría ser que se le asigne algún valor de complemento a 2 nVal
?
nVal = (unsigned int) -5;
. El reparto de-5
tounsigned int
se define en 6.3.1.3. La representación en complemento a 2 no es obligatoria por el estándar, pero el algoritmo para convertir a unsigned es: "el valor se convierte agregando o restando repetidamente uno más del valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo ".Respuestas:
Para la respuesta oficial - Sección 4.7 conv.integral
Básicamente, esto significa que si la arquitectura subyacente se almacena en un método que no es Complemento de dos (como Magnitud con signo o Complemento de uno), la conversión a unsigned debe comportarse como si fuera Complemento de dos.
fuente
Asignará el patrón de bits que representa -5 (en complemento a 2) al int sin signo. Lo cual será un gran valor sin firmar. Para entradas de 32 bits, será 2 ^ 32 - 5 o 4294967291
fuente
ceil(log_2(x))
).Se mostrará como un entero positivo de valor de máximo entero sin signo - 4 (el valor depende de la arquitectura de la computadora y el compilador).
Por cierto,
puede verificar esto escribiendo un programa simple de tipo "hola mundo" en C ++ y verlo usted mismo
fuente
Tiene razón, el entero con signo se almacena en forma de complemento a 2 y el entero sin signo se almacena en la representación binaria sin signo . C (y C ++) no distingue entre los dos, por lo que el valor con el que termina es simplemente el valor binario sin signo de la representación binaria del complemento a 2.
fuente
Sí, tienes razón. El valor real asignado es algo así como todos los bits establecidos excepto el tercero. -1 son todos los bits establecidos (hexadecimal: 0xFFFFFFFF), -2 son todos los bits excepto el primero y así sucesivamente. Lo que vería probablemente sea el valor hexadecimal 0xFFFFFFFB que en decimal corresponde a 4294967291.
fuente
Cuando asigna un valor negativo a una variable sin signo, utiliza el método de complemento a 2 para procesarla y, en este método, cambia todos los 0 a 1 y todos los 1 a 0 y luego le agrega 1. En su caso, está tratando con int, que es de 4 bytes (32 bits), por lo que intenta usar el método de complemento a 2 en un número de 32 bits, lo que hace que el bit superior se invierta. Por ejemplo:
┌─[student@pc]─[~] └──╼ $pcalc 0y00000000000000000000000000000101 # 5 in binary 5 0x5 0y101 ┌─[student@pc]─[~] └──╼ $pcalc 0y11111111111111111111111111111010 # flip all bits 4294967290 0xfffffffa 0y11111111111111111111111111111010 ┌─[student@pc]─[~] └──╼ $pcalc 0y11111111111111111111111111111010 + 1 # add 1 to that flipped binarry 4294967291 0xfffffffb 0y11111111111111111111111111111011
fuente