¿Cuál es la diferencia entre int sin signo y int firmado en C?

Considere estas definiciones:

int x=5; int y=-5; unsigned int z=5; 

¿Cómo se almacenan en la memoria? ¿Alguien puede explicar la representación de estos bits en la memoria?

¿Pueden int x=5 y int y=-5 tener la misma representación de bits en la memoria?

ISO C establece cuáles son las diferencias.

El tipo de datos int está firmado y tiene un rango mínimo de al menos -32767 a 32767 inclusive. Los valores reales se dan en limits.h como INT_MIN e INT_MAX respectivamente.

Un unsigned int tiene un rango mínimo de 0 a 65535 inclusive, con el valor máximo real siendo UINT_MAX de ese mismo archivo de encabezado.

Más allá de eso, el estándar no exige dos notaciones complementarias para codificar los valores, esa es solo una de las posibilidades. Los tres tipos permitidos tendrían codificaciones de lo siguiente para 5 y -5 (utilizando tipos de datos de 16 bits):

  two's complement | ones' complement | sign/magnitude +---------------------+---------------------+---------------------+ 5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101 | +---------------------+---------------------+---------------------+ 
  • En el complemento de dos, obtienes un número negativo al invertir todos los bits y luego agregar 1.
  • En el complemento de unos, obtienes un número negativo al invertir todos los bits.
  • En signo / magnitud, el bit superior es el signo, por lo que simplemente lo invierte para obtener el negativo.

Tenga en cuenta que los valores positivos tienen la misma encoding para todas las representaciones, solo que los valores negativos son diferentes.

Tenga en cuenta además que, para valores sin signo, no necesita usar uno de los bits para un signo. Eso significa que obtienes más rango en el lado positivo (a costa de no tener codificaciones negativas, por supuesto).

Y no, 5 y -5 no pueden tener la misma encoding, independientemente de la representación que utilice. De lo contrario, no habría manera de notar la diferencia.

El estándar C especifica que los números sin firmar se almacenarán en binario. (Con brocas de relleno opcionales). Los números firmados se pueden almacenar en uno de tres formatos: Magnitud y signo; El complemento de dos o el complemento de uno. Curiosamente, eso descarta otras representaciones como Excess-n o Base −2 .

Sin embargo, en la mayoría de las máquinas y comstackdores almacena números firmados en el complemento de 2.

int es normalmente 16 o 32 bits. El estándar dice que int debería ser lo que sea más eficiente para el procesador subyacente, siempre que sea >= short y <= long entonces el estándar lo permite.

Sin embargo, en algunas máquinas y sistemas operativos, el historial no es el mejor tamaño para la iteración actual del hardware.

Aquí está el muy buen enlace que explica el almacenamiento de INT firmado y sin firmar en C –

http://answers.yahoo.com/question/index?qid=20090516032239AAzcX1O

Tomado de este artículo anterior –

“el proceso llamado complemento de dos se usa para transformar números positivos en números negativos. El efecto secundario de esto es que el bit más significativo se usa para indicar a la computadora si el número es positivo o negativo. Si el bit más significativo es un 1, entonces el número es negativo. Si es 0, el número es positivo “.

Debido a que todo se trata de memoria, al final todos los valores numéricos se almacenan en binario.

Un entero sin signo de 32 bits puede contener valores de todos los 0 binarios a todos los 1 binarios.

Cuando se trata de un entero con signo de 32 bits, significa que uno de sus bits (el más significativo) es un indicador, que marca el valor como positivo o negativo.

Suponiendo que int es un entero de 16 bits (que depende de la implementación de C, la mayoría son de 32 bits en la actualidad) la representación de bits es diferente a la siguiente:

  5 = 0000000000000101 -5 = 1111111111111011 

si el binario 111111111111111011 se configuraría como un int sin signo, sería decimal 65531.