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