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
essigned
y debe tener un rango de al menos-32767
a32767
como requisito de rango mínimo. Loslimits.h
se refieren a los valores reales como sus valores correspondientes paraINT MIN
eINT MAX
. - Un
unsigned int
tiene un rango mínimo que se extiende desde0
hasta65535
, inclusive, con el valor máximo real definido por la constanteUINT_MAX
del archivo de encabezado. No necesita utilizar uno de losbits
para unsigno
si 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
int
son4 bytes
, que cuando se multiplican por8
son32 bits
.4x8 = 32 bits
-
Además, el
unsigned int
también ocupa hasta4 bytes
de espacio de memoria, lo que suma32 bits
.- En el tipo de datos
int
, elbit
más a la izquierda en los32-bits
se designa comobit de signo
, que indica si el número entero es positivo o negativo.1
indica un valor negativo, mientras que0
indica uno positivo. - El rango de enteros que actualmente se pueden almacenar en una variable
int
es-(2^31)
a2^31-1
, que es igual a-2 147 483 648
a2 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