ejemplos descargar definicion compiler caracteristicas c++

descargar - c++ manual



int a la conversión int sin firmar (5)

Como sabemos que i un int , ¡puedes continuar y anular la firma !

Esto haría el truco:

int i = -62; unsigned int j = unsigned(i);

Estoy sorprendido de saber que no puedo convertir firmado a unsigned int mediante conversión.

int i = -62; unsigned int j = (unsigned int)i;

Pensé que ya sabía esto desde que comencé a usar yesos, ¡pero no puedo hacerlo!


Esta conversión está bien definida y arrojará el valor UINT_MAX - 61 . En una plataforma donde unsigned int es un tipo de 32 bits (las plataformas más comunes, actualmente), este es precisamente el valor que otros informan. Otros valores son posibles, sin embargo.

El lenguaje real en el estándar es

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).


Puede convertir un int a unsigned int . La conversión es válida y bien definida.

Como el valor es negativo, se le UINT_MAX + 1 para que el valor sea una cantidad válida sin firmar. (Técnicamente, se le agrega 2 N , donde N es la cantidad de bits utilizados para representar el tipo sin signo).

En este caso, como int en su plataforma tiene un ancho de 32 bits, 62 se resta de 2 32 , lo que da 4,294,967,234.


con un poco de ayuda de matemáticas

#include <math.h> int main(){ int a = -1; unsigned int b; b = abs(a); }


Editar : Como se ha observado en las otras respuestas, el estándar en realidad garantiza que " 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) ". Por lo tanto, incluso si su plataforma no almacenara las firmas firmadas como complemento a dos, el comportamiento sería el mismo.

Aparentemente, su entero con signo -62 se almacena en complemento a dos ( Wikipedia ) en su plataforma:

62 como un entero de 32 bits escrito en binario es

0000 0000 0000 0000 0000 0000 0011 1110

Para calcular el complemento de los dos (para almacenar -62), primero invierta todos los bits

1111 1111 1111 1111 1111 1111 1100 0001

luego agrega uno

1111 1111 1111 1111 1111 1111 1100 0010

Y si interpreta esto como un entero de 32 bits sin signo (como lo hará su computadora si lo lanza), terminará con 4294967234 :-)