¿Qué sucede si le doy un valor negativo a una variable sin signo?


Tenía curiosidad por saber qué pasaría si asignara un valor negativo a una variable sin signo.

El código se verá algo así.

unsigned int nVal = 0;
nVal = -5;

No me dio ningún error de compilador. Cuando ejecuté el programa al nVal se le asignó un valor extraño! ¿Podría ser que el valor del complemento de algunos 2 se asigna a nVal?

Author: Evan Carroll, 2010-04-26

5 answers

Para la respuesta oficial - Sección 4.7 conv.integral

"Si el tipo de destino no tiene signo, el valor resultante es el entero menos sin signo congruente con el entero de origen (módulo 2n donde n es el número de bits utilizados para representar el tipo sin signo). [Nota: En una representación de complemento de dos, esta conversión es conceptual y no hay cambio en el patrón de bits (si no hay truncamiento). -nota final ]

Esto esencialmente 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), que la conversión a sin signo debe comportarse como si fuera Complemento de Dos.

 53
Author: Dennis Zickefoose,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-27 10:59:58

Asignará el patrón de bits que representa -5 (en el complemento de 2) al int sin signo. Que será un gran valor sin signo. Para 32 bits ints esto será 2^32-5 o 4294967291

 23
Author: Jasmeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-18 19:16:18

Se mostrará como un entero positivo de valor de max unsigned integer - 4 (el valor depende de la arquitectura de la computadora y del compilador).

BTW
Puede comprobar esto escribiendo un simple programa de tipo C++ "hola mundo" y ver por sí mismo

 4
Author: Dror Helper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 06:46:50

Tienes razón, el entero con signo se almacena en la forma de complemento de 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 que termina con es simplemente el valor binario sin signo de la representación binaria del complemento 2.

 4
Author: perimosocordiae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 06:49:02

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 (hex: 0xFFFFFFFF), -2 son todos los bits excepto el primero y así sucesivamente. Lo que verías es probablemente el valor hexadecimal 0xFFFFFFFB que en decimal corresponde a 4294967291.

 0
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-07 01:43:06