tablas tabla resueltos relativa paso para frecuencias frecuencia estadistica ejercicios ejemplos distribucion descriptiva datos agrupados c++ integer

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.