2010-09-28 193 views
27

Considere estas definiciones:¿Cuál es la diferencia entre unsigned int y signed int en C?

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

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

Can int x=5 y int y=-5 tienen la misma representación de bit en la memoria?

+0

Esta pregunta puede necesitar un capítulo para elaborar. Si desea conocer los pormenores, consulte [enteros sin signo y firmados] (http://kias.dyndns.org/comath/13.html) para obtener más información. – anonymous

Respuesta

3

Aquí es 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 -

proceso

" llamado complemento a dos se utiliza para transformar números positivos en números negativos. El efecto secundario de esto es que el bit más significativo se utiliza para decirle 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 ".

+0

ok en el compilador de 16 bits me puede decir cómo int x = 5 y int y = -5 almacenan internamente en la memoria. Proporcione una representación de bits –

+6

Tenga en cuenta que el complemento de 2 no es la única representación firmada permitida para una implementación de C: también se permiten tanto el complemento como la magnitud de signo. – caf

0

int Suponiendo es un entero de 16 bits (que depende de la aplicación C, la mayoría son de 32 bits hoy en día) la representación de bits difiere como la siguiente:

5 = 0000000000000101 
-5 = 1111111111111011 

si binario 1111111111111011 se establecería en un unsigned int , sería decimal 65531.

+6

Por cierto, ISO C no _ _ _ manda la representación de complemento 2. – paxdiablo

+0

ok en compilador de 16 bits me puede decir cómo int x = 5 y int y = -5 almacenan internamente en la memoria. Proporcione una representación de bits –

+0

@Anand: ¿qué es lo que realmente quiere? existe la representación de bit (en complemento de dos) en la respuesta ya. –

4

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

Sin embargo, en la mayoría de las máquinas y compiladores, almacene números con signo en complemento a 2.

int normalmente son 16 o 32 bits. La norma dice que int debe ser lo que sea más eficiente para el procesador subyacente, siempre que sea >= short y <= long, entonces está permitido por la norma.

En algunas máquinas y el sistema operativo el historial tiene causas int sin embargo, no es el mejor tamaño para la iteración actual del hardware.

+0

ok en el compilador de 16 bits me puede decir cómo int x = 5 y int y = -5 almacenan internamente en la memoria. Proporcione una representación de bits –

+0

-1: Desafortunadamente su respuesta es incorrecta. C prescribe con mucha precisión cómo se representarán los números enteros. En particular para los tipos sin firmar, no hay muchas opciones para la implementación del compilador. Pero incluso para los tipos firmados, el estándar es bastante restrictivo. Y 'int' de ninguna manera es el tipo que es más eficiente para el procesador. En la mayoría de los casos, actualmente está atascado con 32 bits (simplemente por razones sintácticas más que cualquier otra cosa), donde la más eficiente suele ser 64. –

+0

@Jens Gustedt: "Desafortunadamente", la respuesta de Douglas es muy correcta. El estándar no discrimina entre el complemento de dos, el complemento de uno o la magnitud con signo, solo establece que las representaciones positivas de los ints firmados deben ser idénticas a la representación de los mismos valores en ints sin signo. La norma también establece que "un objeto 'simple' ** int ** tiene el tamaño natural sugerido por la arquitectura del entorno de ejecución".Que las implementaciones arruinaron esto no es culpa del lenguaje. Douglas tiene toda la razón, así que le doy +1 para compensar su -1. – DevSolar

37

ISO C indica 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 y 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 del mismo archivo de encabezado.

Más allá de eso, el estándar no exige la notación de dos a pares para codificar los valores, esa es solo una de las posibilidades.Los tres tipos permitidos tendrían codificaciones de los siguientes para 5 y -5 (el uso de 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 complemento a dos, se obtiene un negativo de una serie invirtiendo todos los bits a continuación, añadir 1.
  • En el complemento de uno, obtienes un número negativo invirtiendo todos los bits.
  • En signo/magnitud, el bit superior es el signo, por lo que solo debe invertirlo para obtener el negativo.

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

Tenga en cuenta además que, para los valores sin signo, no necesita utilizar uno de los bits para un signo. Eso significa que obtienes más rango en el lado positivo (a cambio de ninguna codificación negativa, por supuesto).

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

+3

Sin embargo, exige una elección de complemento de 2, complemento de uno o magnitud de signo. – caf

+0

¿Podría una implementación conforme usar la misma representación para números firmados y sin firmar, y simplemente forzar el bit de signo a ser '0' para operaciones en tipos declarados 'sin firmar' (de modo que esencialmente sería un 'bit de relleno')? – supercat

+0

Posiblemente, creo que se puede permitir pero, dado que el rango mínimo es 0-65536, necesitarías al menos 17 bits para ese esquema. Eso contaría los enteros sin signo de 16 bits, pero probablemente estaría bien con los enteros de 32 bits. No estoy seguro de esto, ya que no he estudiado atentamente si la envoltura de unsigned está especificada por ISO, pero parece ineficiente/derrochador para la cosecha actual de CPU al menos. – paxdiablo

2

Porque todo es solo cuestión 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 1s binarios.

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

+0

¿Puede decirme en este caso cómo comprobar si el valor dado a un s8 (8 bits firmado) si está fuera de rango o no? ¿Debo comparar el valor a 0x7F en lugar de 0xFF? ¿Y debería verificar primero el bit de signo? Gracias –

Cuestiones relacionadas