c++ - tabla - frecuencia relativa
¿Qué sucede si asigno un valor negativo a una variable sin signo? (6)
Tenía curiosidad por saber qué pasaría si asignaba un valor negativo a una variable sin firmar.
El código se verá algo así.
unsigned int nVal = 0;
nVal = -5;
No me dio ningún error de compilación. Cuando ejecuté el programa, nVal
recibió un valor extraño. ¿Podría ser que el valor de complemento de 2 se asigna a nVal
?
Asignará el patrón de bits que representa -5 (en complemento a 2) al int sin signo. Que será un gran valor sin signo. Para 32 bits, esto será 2 ^ 32 - 5 o 4294967291
Esto es lo que he ejecutado en Objective-C iOS 4.3
unsigned long testValue = 0;
NSLog(@"The value is: %lu", testValue);
testValue -= 5;
NSLog(@"The new value is: %lu", testValue);
Salida a la consola:
The value is: 0
The new value is: 4294967291
El nuevo valor en Hex es 0xFFFFFFFB
¿Cuál es el complemento de 2 de -5?
Para la respuesta oficial - Sección 4.7 [conv.integral]
"Si el tipo de destino no está firmado, el valor resultante es el entero menos sin signo congruente con el entero de origen (módulo 2 ^ n donde n es el número de bits utilizados para representar el tipo sin signo). [Nota: En una representación complementaria de dos, esta conversión es conceptual y no hay cambios en el patrón de bits (si no hay truncamiento). -finalizar nota]
Se mostrará como un entero positivo de valor máximo de entero sin signo - 4 (el valor depende de la arquitectura de la computadora y el compilador).
Por cierto
Puede comprobar esto escribiendo un sencillo programa tipo "mundo hola" de C ++ y vea por usted mismo
Si, estás en lo correcto El valor real asignado es algo así como todos los bits establecidos, excepto el tercero. -1 es todos los bits establecidos (hex: 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.
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 de 2.