Me piden analizar el siguiente programa y deducir por qué al momento de dar el resultado sin signo me da el número 4294...... Y¿ por qué sucede ?
Respuestas a la pregunta
Detalles Problema
Las variables "csigno" y "ssigno" están representadas en un tipo de dato primitivo denominado "int" esto significa que se puede almacenar números enteros.
La pregunta ahora es ¿Cuantos números se puede almacenar en una variable de tipo "int"?
Para responder esta pregunta se necesita conocer el tamaño de bits que tiene "int"
Un tipo primitivo "int" tiene un tamaño de "32 bits". Esto significa que, si deseas conocer el rango de números enteros capaz de almacenar esos 32 bits, realizas el siguiente proceso:
Elevas la base 2 (es binario) a la cantidad de x bits que te permite guardar ese tipo de dato.
# Procedimiento
2 ^ 31 bits = 2147483648
En esta demostración no se eleva la base 2 a 32 bits ya que se resta 1 bit que se usa para agregar el signo negativo
El resultado es 2'147 483 648. Esto quiere decir que
Para números positivos se puede almacenar desde 0 hasta 2147483647 (2147483648 - 1).
Puedes preguntarte ¿Por que no puede almacenar hasta el número 2147483648 en positivos?
Esto se debe a que, el 0 tambien cuenta como número en positivos, asi que, si sumas 2147483647 + 1 (Que incluye el cero "0") da 2147483648, por este motivo no se incluye el número 2147483648 en positivos.
Para números negativos se puede almacenar desde -1 hasta -2147483648.
En resumen un tipo de dato "int" puede almacenar numeros en un rango que va desde -2147483648 hasta 2147483647
Finalmente si conviertes cualquiera de estos números a binario devolverá hasta un máximo de 31 bits para positivos y para negativos 32 bits ya que 1 bit se usa para agregar el signo - (menos)
Ahora que ya se conoce el proceso de como funcionan los bits en los números. Creamos un ejemplo de como se vería un número cualquiera en binario:
Número Entero ===> 33
En binario el número 33 es:
100001 (Tiene 6 bits)
Puedes preguntarte ¿Por que el número solo tiene 6 bits y no 31 bits?
Esto es porque no hace falta rellenar los 31 bits, ya que el número es pequeño y solo con 6 bits ya se puede representar su valor.
Pero como demostración con sus 31 bits se verá asi:
0000000000000000000000000100001 (Tiene 31 bits)
Para convertir ahora de binario (100001) a número (33) nuevamente:
543210 = Secuencia para ir elevando en la base 2
100001
------------
2^(5) + 2^(0)
32 + 1 = 33
Elevamos 2 al número de la secuencia que esta arriba del binario solo tomando los numeros que tienen 1 en binario y los que tienen 0 descartamos.
Ahora si retonamos la pregunta inicial de la tarea
La variable "csigno" esta creada como "int"
int csigno;
Lo que significa esto es que podemos guardar cualquier numero en este rango -2147483648 hasta 2147483647
Ejemplo:
csigno = 10;
csigno = -10;
Esto siempre devolverá el mismo número almacenado. Por lo tanto nunca cambia el resultado que se muestra en la terminal.
La variable "ssigno" por otra parte esta creada como "unsigned int"
unsigned int ssigno;
Dado que unsigned elimina el signo negativo (el cual hablamos antes), entonces signitiva que la variable "ssigno" ya no va a guardar 31 bits + 1 bit del signo - (menos)
Ahora va a guardar 32 bits (de forma literal) sin quitar 1 bit para el signo negativo. Por lo tanto realizamos el mismo procedimiento que se explica arriba para saber el rango de números que ahora va a guardar esta nueva variable.
# Procedimiento
2 ^ 32 bits = 4294967296
Entonces el resultado da que se puede almacenar esa cantidad de números. Esto quiere decir que el rango va desde 0 hasta 4294967295
Explicamos por que no es 4294967296 dado que tambien se cuenta el número 0
La pregunta ahora es ¿Por que el rango no incluye negativos y solo va desde cero hasta 4294967295?
La respuesta es porque como se menciona antes, unsigned elimina el signo negativo, por este motivo cuando se asigna "unsigned int" en resumen solo se aceptan positivos.
Hasta ahora ya se ha explicado para que se usa unsigned. Ahora pasemos al ¿Por que? del numero extraño que aparece al final del resultado.
Al final la variable "ssigno" almacena un número positivo 10 y luego uno negativo -10.
ssigno = 10;
El resultado sera siempre el mismo número, como ya se ha dicho, acepta numeros positivos entre 0 hasta 4294967295
Por este motivo el resultado vuelve a ser 10 en la terminal
Ahora casi al final se vuelve a asignar un número a la variable ssigno
ssigno = -10;
Pero esta vez es negativo, dado que no podemos guardar un número negativo en esta variable por el motivo que se dijo antes que usa "unsigned", el lenguaje C/C++ internamente convierte ese número negativo a positivo con un detalle, que lo hace a la inversa. Comienza desde el número mas grande que puede utilizar y va contando hasta 10 veces o si se prefiere va restando 1 hasta contar 10 veces.
Demostración:
4294967295 (1)
4294967294 (2)
4294967293 (3)
4294967292 (4)
4294967291 (5)
4294967290 (6)
4294967289 (7)
4294967288 (8)
4294967287 (9)
4294967286 (10)
Asi que finalmente el resultado que almacena la variable "ssigno" es "4294967286"
Ya que paso el numero negativo
ssigno = -10;
a positivo
ssigno = 4294967286;
Y esto es lo que imprime en la terminal.