Informática, pregunta formulada por ortizliraangel6, hace 1 mes

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 ?​

Adjuntos:

Respuestas a la pregunta

Contestado por Polfed
1

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.


ortizliraangel6: hola profeso será que me puede ayudar con otra pregunta ?
ortizliraangel6: la publique pero no he recibido respuesta ...por favor
Otras preguntas