RECUERDA SEGUIRNOS


Suscríbete a nuestro canal Síguenos en Dailymotion Síguenos en Facebook  Síguenos en Twitter Síguenos en Instagram Síguenos en TikTok Unete a nuestro Discord Síguenos en Kwai Síguenos en Linkedin Escríbenos a nuestro WhatsApp Síguenos en Telegram Síguenos en Twitch Suscríbete a tu sitio web

SECCIONES PRINCIPALES DE APRENDIZAJE

Nuestros Videojuegos

Descubre aquí el procedimiento y la finalización de nuestros Videojuegos, los cuales te servirán como guía.

Gran Presentación

Conoce todo lo que aprenderás en este gran viaje de desarrollo de Videojuegos con Estacion Racso.

Programación

Aprende a programar en C++, Java y C#, tres de los lenguajes mas usados para el desarrollo de VideoJuegos.

Guía Completa

Accede a la mega guía completa de desarrollo de VideoJuegos que tenemos preparada para ti.

EL GRAN SECRETO de signed vs unsigned | MEGA CURSO DE C++ (Clase # 10)

MEGA CURSO DE C++ (Clase # 10): EL GRAN SECRETO de Signed vs Unsigned

Imagínate por un momento que tenemos 3 variables de tipo entero declaradas, la primera es: numero1 que tiene almacenado un número mayor a 10 cifras, la segunda es: numero2, que tan solo tiene almacenado un 1, y este tercera es: suma, que simplemente almacena el resultado de la suma entre la variable numero1 y numero2

Datos de las 3 variables declaradas
Datos de las 3 variables declaradas

Y por lógica, es resultado debería ser el mismo número de la variable numero1, pero con la diferencia de que el ultimo digito en vez de ser un 7 cambiaria a un 8

Resultado esperado
Resultado esperado

Y si compilamos, el resultado por alguna razón es negativo

Resultado NO esperado
Resultado NO esperado

¿Pero por qué?, ¿Qué podemos hacer en este caso para que el resultado sea positivo, que eso es lo que queremos?, pues justamente ese es el gran secreto que vamos a revelar en este momento, con el que vas a conocer la diferencia entre los famosos: Signed vs Unsigned, por eso te damos la bienvenida a esta gran clase DE ESTE MEGA CURSO DE C++, así que no le demos tantas vueltas y arranquemos, pero de una vez:


Y bueno, en la clase pasada vimos detalladamente los tipos de datos básicos, también vimos la declaración de variables, que eran, para que sirven, como se usan, por eso, si tu no has visto esa clase es muy recomendable que le des un vistazo, porque de lo contrario no vas a entender nada de esta

CLASE ANTERIOR: Domina los datos básicos

Precisamente porque tu tienes que tener muy en claro que, al momento de nosotros declarar una variable y asignarle un valor, ya sea de forma inmediata o dejando la variable vacía momentáneamente para almacenarle el valor después, dicho valor pasa a formar parte de una caja, que simplemente un espacio en memoria reservado por nosotros

Representación gráfica de una variable
Representación gráfica de una variable

y lo primero que hace el computador es pasar a leer de primeras ese dato, ósea lo que esta después del igual

El valor almacenado es leído de primeras por el computador
El valor almacenado es leído de primeras por el computador

es por eso que cuando nosotros almacenamos variables dentro de otras y más que todo con el objetivo de hacer operaciones matemáticas, el sistema primero resuelve esa operación y ese valor es asignado a la variable, ósea, pasa a pertenecerle, y así se mantiene hasta que nosotros le cambiemos ese valor en el caso de las: Variables normales, porque si son constantes su valor nunca va a cambiar, tal cual como lo vimos en la clase pasada

Resultado asignado a la variable: suma
Resultado asignado a la variable: suma

es por esa razón que, cuando nosotros invocamos alguna variable, no la llamamos por el valor almacenado, sino directamente por el nombre, eso es como si nosotros literal tuviéramos una caja con algún valor adentro y la pudiéramos transportar para donde nosotros quisiéramos

Las variables son invocadas directamente por el nombre
Las variables son invocadas directamente por el nombre

pero, entre más grande sea el valor almacenado, más va pesar nuestra variable, y tenemos que mirar muy bien si el valor que nosotros estamos almacenando en esa variable en realidad cabe o no, por eso aquí viene el gran secreto que muchos ignoran, y es, ¿Dónde se guardan todos esos datos y, sobre todo, cuanto espacio nosotros disponemos en cada variable?, porque como todo, siempre se tiene un límite, un rango

¿Dónde se guardan todas nuestras variables?
¿Dónde se guardan todas nuestras variables?

y pues la respuesta es muy sencilla, todas nuestras variables se almacenan en la memoria RAM, pero lo interesante es que como el sistema no sabe cuanta memoria reservar por cada variable que nosotros declaramos, entonces se fija muy bien en el tipo de dato que nosotros especificamos para esa variable y en base a eso reserva el espacio finito, ósea, se basa en el rango de memoria permitido para cada tipo de dato, es por esa razón que es muy importante especificar correctamente el tipo de dato para cada variable que nosotros declaremos, por ejemplo, si vamos a trabajar con datos de tipo: Entero, pues lo correcto es indicar que la variable va a hacer de tipo entero, ¿Y cómo?, pues, con la palabra reservada: int, y así mismo, si se va a trabajar con valores de tipo: Verdadero o Falso, pues, lo correcto es indicar que la variable va ser de tipo booleana, ósea, con la palabra reservada: bool y así sucesivamente con cada tipo de dato que vimos en la clase pasada

Representación de la importancia de indicar correctamente los tipos de datos

y esto es bastante útil, no solo para nosotros saber con qué tipos de datos estamos trabajando, sino que también dependiendo del tipo de dato que nosotros especifiquemos, le estamos diciendo al computador como interpretar la información que nosotros le estamos dando, además, en base a ese tipo de dato el sistema va a reserva o más memoria o menos para nuestra variable, (dependiendo el rango), por eso pasemos directamente al código para que la explicación anterior quede todavía más clara.

Interpretación de los diferentes tipos de datos
Interpretación de los diferentes tipos de datos


INTERPRETACIÓN DE DATOS

Ahora, supongamos que nosotros declaramos una variable de tipo char y le ponemos como nombre: letra, y de una vez le asignamos la letra: 'd', y le agregamos un mensaje indicando una doble salida de datos

Declaración de la variable: letra
Declaración de la variable: letra

ahora, si compilamos, pues, efectivamente nos imprime la letra: 'd'

Resúltado de la variable: letra
Resúltado de la variable: letra


pero ahora, que pasa si nosotros a pesar de saber qué las variables de tipo char solo almacenan caracteres, que pasaría si nos ponemos de mamagallistas, y le agregamos números enteros, supongamos en este caso le agregamos el número: 100

Agregando números enteros a la variable: letra
Agregando números enteros a la variable: letra

ahora, si compilamos, nos sigue mostrando la misma letra: 'd', a pesar de que cambiamos el tipo de dato de carácter a un número entero

Resultado interpretado de otra manera de la variable: letra

pero, ¿Porque pasa eso?, y es, precisamente, porque como un computador solo sabe leer binario, ósea: ceros y unos, tal cual como te lo explicamos en la clase de compilación

¿Qué sucede durante el proceso de Compilación de un código de C++? ¡DESCUBRELO AQUÍ!

entonces, nosotros tenemos una secuencia de solo ceros y unos, pero dependiendo el tipo dato que nosotros especifiquemos, esa secuencia es interpretada de una manera o de otra, por ejemplo, en este caso, al nosotros almacenar números enteros en una variable de tipo char, pues inmediatamente lo interpreta como un: código ASCII

Codigo: ASCII
Codigo: ASCII


No te preocupes si en este momento no sabes o no entiendes que es eso de: código ASCII, porque cuando lleguemos a esa parte te vamos a explicar más detalladamente todo eso, pero por ahora quédate con la idea de que, en este caso, si nosotros agregamos números enteros en una variable de tipo char van a ser interpretados como letras, números o caracteres, por ejemplo, supongamos, ahora le cambiamos el numero 100, a un 1

Cambio de valor de la variable: letra
Cambio de valor de la variable: letra

y si compilamos, ahora nos imprime una carita

Resultado variable: letra

entonces, qué pasaría si cambiamos el tipo de dato y le ponemos ahora si el correcto, que en este caso es el tipo entero con la palabra reservada: int

Cambiando el dato incorrecto
Cambiando el dato incorrecto


y si compilamos, efectivamente, ahora si nos imprime el dato correctamente

Resultado correcto
Impresión dato correcto

entonces, es para que tengas muy en cuenta eso, precisamente porque se nos puede formar un enredo el berraco, llegando a errores o a un resultado no deseado, si nos ponemos de mamagallistas a declarar y almacenar datos, pero de forma incorrecta.


SIGNED VS UNSIGNED

Nosotros al principio de la clase estábamos intentando hacer una suma de dos números enteros positivos, pero por alguna razón extraña obteníamos un resultado negativo

Resultado No deseado de la variable: suma
Resultado No deseado de la variable: suma


¿Y porque era?, y la respuesta es: Porque no estábamos agregando ningún modificador para el numero que intentábamos almacenar en la variable suma, y es precisamente que, si tu vas a trabajar con números enteros de: 9 o más cifras, ya en este caso no podemos especificar el tipo de dato simplemente con la palabra reserva int, precisamente porque el espacio en memoria que de primer momento el sistema reservó para nuestra variable suma no es el suficiente para almacenar un número mayor a 9 cifras, entonces, ¿Qué podemos hacer?, pues muy sencillo, tan solo fíjate en el siguiente cuadro:

NOMBRE DEL TIPO DE DATO TAMAÑO EN BYTES TAMAÑO EN BITS OTROS NOMBRES RANGO O INTERVALO DE VALORES PERMITIDOS
int 4 32 signed De -2.147.483.648 a 2.147.483.647
unsigned int 4 32 unsigned De 0 a 4.294.967.295

Para el caso de una variable de tipo entero, el sistema reserva en memoria 4 bytes, ósea, 32 bits, incluso, el cuadro nos muestra que el tipo de dato int también se puede escribir con la palabra signed, y si nosotros hacemos la prueba

Cambio de palabra reserva de: int a signed
Cambio de palabra reserva de: int a signed


efectivamente, podemos escribir este tipo de dato entero tanto como: int o como signed, ¡Y es lo mismo!

Resultado tanto como: int o como signed
Resultado tanto como: int o como signed 


incluso, en el cuadro vemos otro tipo de dato que vendría siendo ahora si con el modificador unsigned y con la palabra reservada int, y aunque ambos utilizan la misma cantidad de memoria, los intervalos cambian, por ejemplo para el caso del tipo int normal, el rango en números que nosotros podemos almacenar en variables de tipo entero, vendría siendo desde la cantidad negativo que vemos en el cuadro, hasta la otra cantidad pero en positivo, incluso, si te fijas el número en positivo es el que nosotros tenemos almacenado en nuestra variable: numero1, y si analizas, ese el número máximo que nosotros podemos guardar en una variable normal de tipo entero

Número máximo almacenado en la variable: numero1
Número máximo almacenado en la variable de tipo entero: numero1

ahora, si nosotros intentamos agregarle un número más a ese límite, inmediatamente el sistema regresa al principio del rango, ósea, se reinicia, es por esa razón que nos arroja un resultado negativo y si analizas te darás cuenta que el resultado que nos está imprimiendo es exactamente el mismo número inicial que esta en el intervalo de valores

Valor reseteado
Valor reseteado

ahora, si nosotros utilizamos el tipo de dato int, con el modificador unsigned, el rango aumenta, y además, todos los números del intervalo pasan a ser positivos, (tal cual como lo vemos en el cuadro), por lo que ya podemos almacenar un numero mucho más grande, incluso el doble de extenso si queremos o si se requiere, precisamente porque estamos pasando de: Dos mil millones a Cuatro mil millones, ahora, si nosotros cambiamos el tipo de dato de la variable suma, y le ponemos el modificador unsigned que él es el encargado de aumentar el rango el rango y después escribimos la palabra int

Agregando el modificador unsigned
Agregando el modificador unsigned

efectivamente, ahora si nos imprime el resultado en positivo como nosotros queríamos

Impresión resultado en positivo
Impresión resultado en positivo

y esto es para que tú lo tengas muy en cuenta, sobre todo cuando estés trabajando con números muy extensos, ya sea porque estás programando una calculadora, algún proyecto financiero, un videojuego muy complejo o por algo en específico, si se te presenta ese tipo de errores, ¡Pues ya sabes cómo solucionarlo!.


DIFERENCIAS ENTRE: SIGNED Y UNSIGNED

Y ahora otro punto, nosotros sabemos que en este momento te estás preguntando, ¿Cuál es la diferencia entre signed y unsigned?, ¡Y la respuesta es muy sencilla!, signed es lo que el sistema ya trae por defecto, por ejemplo, cuando nosotros declaramos una variable con el tipo de dato int, en realidad ese variable es de tipo: signed int, que con esto nosotros estamos especificamos de que queremos que nuestra variable pueda contener signos, tanto negativos como positivos, de hecho, no hay necesidad de escribir signed int o signed para declarar variables de tipo entero, porque es lo mismo, simplemente con la palabra reservada int ya se sobre entiende de que vamos a almacenar números tanto positivos como negativos, es por esa razón que cuando nosotros miramos en el cuadro el rango máximo que se puede almacenar en una variable de tipo entero normal, nos muestra un intervalo que parte, desde números negativos hasta positivos, además signed no es ningún modificador, a diferencia que cuando nosotros especificamos una variable de tipo entero pero si la escribimos con el modificador unsigned, (que en este caso unsigned si es un modificador), ya con eso le estamos diciendo a la máquina de que nos amplie el rango porque ya no queremos signos, en especial el signo negativo, ósea, que solo vamos a utilizar números positivos

Cuando utilizamos el modificador unsigned solo podemos agregar números positivos
Cuando utilizamos el modificador: unsigned, solo podemos agregar números positivos

además, si analizamos la traducción, signed significa: Con signos y unsigned: Sin signos, y efectivamente, si agregamos el modificador unsigned solo vamos a poder trabajar con números positivos, porque si incluimos números negativos, vamos a tener un error, por ejemplo, si nosotros nos ponemos de mamagallistas a declarar una variable de tipo entero con el modificador unsigned, (Que recuerda que los modificadores como por ejemplo en este caso unsigned siempre se escriben antes del tipo de dato), ahora le ponemos el nombre, numero pero le agregamos un: -3

Agregando un valor incorrecto a la variable int con el modificador unsigned
Agregando un valor incorrecto a la variable int con el modificador unsigned


efectivamente, en vez de imprimirnos el -3, nos imprime un número que nada tiene que ver con el valor almacenado

Impresión resultado incorrecto
Impresión resultado incorrecto

entonces, es para que tu tengas muy en cuenta eso, es por esa razón que si miramos el en cuadro el rango que podemos almacenar en una variable de tipo int con el modificador unsigned solo nos muestra números positivos, pero cabe aclarar que en este caso es obligatorio escribir la palabra reservada unsigned antes del int si se quiere ampliar el rango, porque si no lo hacemos el sistema va a pensar de que estamos declarando una variable de tipo entero normal y por ende piensa que queremos trabajar con números tanto positivos como negativos.


CONCLUSIÓN

MEGA Curso intensivo de C++ para Videojuegos y mucho más (TOTALMENTE GRATIS)


Sin duda, el signed y unsigned, es muy importante tenerlos en cuenta sobre todo si estás trabajando con grandes cantidades de datos, porque de lo contrario vamos a experimentar errores en nuestros programas o videojuegos, aunque cabe resaltar que el signed y unsigned solo aplica para tipos de dato entero, porque con el resto de los datos no aplica, ahora, ¿Que pasaría si nosotros quisiéramos ampliar el rango pero seguir utilizando números positivos y negativos?, pues precisamente eso es lo que vamos a ver en la próxima clase, donde vamos a conocer detalladamente los modificadores short y long:



NOTA: Sí quieres ayudarme y motivarme a seguir aportando contenido de alta calidad y que siga siendo completamente gratis, ¡No dudes en dejarnos tu donación!.
Ayudanos con tu donación

SÍGUENOS EN NUESTRAS REDES:

Suscríbete a nuestro canal Síguenos en Dailymotion Síguenos en Facebook Síguenos en Twitter Síguenos en Instagram Síguenos en TikTok Unete a nuestro Discord Síguenos en Kwai Síguenos en Linkedin Escríbenos a nuestro WhatsApp Síguenos en Telegram Síguenos en Twitch Suscríbete a tu sitio web

Muchas gracias también porque sabemos que has dado click en el botón que dice: SEGUIR de esta tu página web, y también porque compartes todos nuestros conocimientos y proyectos con los que más puedes, un abrazo gigante, mil bendiciones y nos vemos en la próxima clase.
Copyright © Estacion Racso