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
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
Y si compilamos, el resultado por alguna razón es negativo
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
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
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
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
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?
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 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
ahora, si compilamos, pues, efectivamente nos imprime la letra: 'd'
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
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
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
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
y si compilamos, efectivamente, ahora si nos imprime el dato correctamente
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
¿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
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
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 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
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
efectivamente, ahora si nos imprime el resultado en positivo como nosotros queríamos
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
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
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
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
Pero sabes que es lo más bacano de todo, ES QUE PUEDES ENCONTRAR ESTE GRAN CURSO DE C++ COMPLETO Y TOTALMENTE GRATIS, AQUÍ:
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!.
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.