Diferencia entre Unsigned Int y Signed Int en C

Muhammad Zeeshan 12 octubre 2023
  1. Diferencia entre Int con y sin signo en C
  2. Requisitos de memoria
  3. Conclusión
Diferencia entre Unsigned Int y Signed Int en C

El siguiente artículo explorará las distinciones entre int con y sin signo en el lenguaje de programación C.

Diferencia entre Int con y sin signo en C

La distinción entre un signed int y un unsigned int no es tan complicada como algunos piensan. Un signed int a menudo se representa como int, pero cuando se trata de unsigned int, debemos escribir unsigned int.

El hecho de que int sea un tipo de datos y unsigned sea solo una palabra clave tiene una función específica conectada a nivel de hardware. Este propósito único crea la diferencia más significativa entre los dos, que se tratará con más detalle en las siguientes partes.

  • El tipo de dato int es signed y debe tener un rango de al menos -32767 a 32767 como requisito de rango mínimo. Los limits.h se refieren a los valores reales como sus valores correspondientes para INT MIN e INT MAX.
  • Un unsigned int tiene un rango mínimo que se extiende desde 0 hasta 65535, inclusive, con el valor máximo real definido por la constante UINT_MAX del archivo de encabezado. No necesita utilizar uno de los bits para un signo si el valor es unsigned.

Eso implica que recibe una variedad más amplia de codificaciones positivas a expensas de ninguna negativa.

Requisitos de memoria

Primero, comprueba cuánto espacio de memoria ocupan los signed int y unsigned int en el sistema del ordenador.

  1. Los requisitos de memoria para un int son 4 bytes, que cuando se multiplican por 8 son 32 bits.

    4x8 = 32 bits
    
  2. Además, el unsigned int también ocupa hasta 4 bytes de espacio de memoria, lo que suma 32 bits.

    • En el tipo de datos int, el bit más a la izquierda en los 32-bits se designa como bit de signo, que indica si el número entero es positivo o negativo. 1 indica un valor negativo, mientras que 0 indica uno positivo.
    • El rango de enteros que actualmente se pueden almacenar en una variable int es -(2^31) a 2^31-1, que es igual a -2 147 483 648 a 2 147 483 647).

Cuando se ingresaba un número negativo en la computadora, se representaba como el complemento a 2 de ese número en forma binaria. Debido a esto, los bits iniciales de la memoria siempre estarían configurados en uno, y la computadora sabría que había encontrado un número negativo cada vez que viera el bit inicial configurado en 1.

Siempre que accedemos a ese número, vuelve a su forma original aplicándole el complemento de 2. Sin embargo, con el tipo de datos unsigned int, no existe un bit como sign bit.

Por lo tanto, ahora tiene todos los 32-bits disponibles para que los usemos para almacenar los datos. El rango de enteros que se pueden almacenar en un unsigned int es de 0 a 2^32-1, que es equivalente a 0 a 4, 294, 967, 295, inclusive.

La variable del tipo de datos unsigned int es donde la computadora normalmente almacena datos en formato binario.

Tengamos un ejemplo. Para empezar, le daremos a la variable x un valor inicial del tipo sin signo.

Luego, cuando intentamos guardar el número negativo en la variable unsigned int x, la computadora usó el complemento a 2 del 123 para representarlo como un número negativo. Luego almacenó esa representación en la memoria de la variable x.

unsigned int x;
x = -123;

Entonces, cuando guardamos el negativo -123 en la variable y del tipo de datos int, la computadora tomó el complemento a 2 del -123 para representarlo como un entero negativo y luego lo almacenó en el memoria de la variable y.

int y;
y = -123;

Las variables Unsigned int sólo contienen valores positivos en forma binaria estándar; no se reservó ningún sign bit cuando intentamos acceder a su memoria a través de la memoria de la variable x. Como resultado, el ordenador no necesitó conversiones, y el complemento de 2 que se había guardado previamente se recuperó y se mostró como un número binario normal.

printf("%d\n", x);

Cuando intentamos acceder a la memoria de la variable y, la computadora determinó que era del tipo de dato int. Luego buscó el bit a la izquierda de la posición más a la izquierda de 32 bits y descubrió que era 1.

Como resultado, volvió a tomar el complemento a 2, añadió un signo negativo (-) e imprimió el resultado.

printf("%d\n", y);

Código fuente completo:

#include <stdio.h>

int main() {
  unsigned int x;
  x = -123;
  int y;
  y = -123;
  printf("%d\n", x);
  printf("%d\n", y);
  return 0;
}

Producción :

-123
-123

Conclusión

Ahora que estamos familiarizados con las distinciones principales entre enteros con signo y enteros sin signo, también debe tener en cuenta que hay varias ventajas y desventajas asociadas con ambas formas de datos, cuyo equilibrio depende completamente de las necesidades que tenga.

Por ejemplo, debe usar unsigned int si desea almacenar números enormes y está seguro de que nunca habrá un valor negativo. De lo contrario, ayudaría si usara el tipo de datos int.

Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Artículo relacionado - C Integer