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
intessignedy debe tener un rango de al menos-32767a32767como requisito de rango mínimo. Loslimits.hse refieren a los valores reales como sus valores correspondientes paraINT MINeINT MAX. - Un
unsigned inttiene un rango mínimo que se extiende desde0hasta65535, inclusive, con el valor máximo real definido por la constanteUINT_MAXdel archivo de encabezado. No necesita utilizar uno de losbitspara unsignosi el valor esunsigned.
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.
-
Los requisitos de memoria para un
intson4 bytes, que cuando se multiplican por8son32 bits.4x8 = 32 bits -
Además, el
unsigned inttambién ocupa hasta4 bytesde espacio de memoria, lo que suma32 bits.- En el tipo de datos
int, elbitmás a la izquierda en los32-bitsse designa comobit de signo, que indica si el número entero es positivo o negativo.1indica un valor negativo, mientras que0indica uno positivo. - El rango de enteros que actualmente se pueden almacenar en una variable
intes-(2^31)a2^31-1, que es igual a-2 147 483 648a2 147 483 647).
- En el tipo de datos
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.
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