Entonces, si char
es 1 byte
así, son 8 bits, ¿verdad?
Entonces, ¿2 ^ 8 = 256 y 0 a 255 es el rango de caracteres?
¿Cómo funciona esto con entradas firmadas y sin firmar? Un int tiene 4 bytes, es decir, 32 bits, entonces 2 ^ 32
. 2 ^ 31 - 1 te da el rango positivo de entradas con signo, entonces, ¿qué sucede con el bit 32? ¿Se utiliza para el letrero? ¿Cómo se almacenaría una señal en la memoria?
Respuesta1
Si el tipo de datos se define como un tipo con signo, existen diferentes tipos de representación, principalmente la representación de magnitud con signo y la representación en complemento a dos.
Para la representación de magnitud con signo, sí, el bit de signo se almacenó como el bit más significativo (MSB, es decir, el bit más a la izquierda). MSB de 0 representa una cifra positiva mientras que 1 representa una cifra negativa. Ejemplo:
7 = 00000111
-7 = 10000111
Esto es simple y (relativamente) legible por humanos; sin embargo, los tipos de números enteros generalmente sonnomantenido de esta manera por dos problemas:
(1) Hay dos representaciones para cero, +0 y -0. Resulta complicado comparar cifras, ya que crea un caso especial.
(2) No es fácil hacer cálculos (tan simples como sumar y restar). Sumar dos números positivos, un número positivo con un número negativo, un número negativo con un número positivo y sumar dos números negativos son cuatro casos de uso diferentes. por ejemplo, 7+6 es sencillo
1 Carry bit
7 = 00000111
6 = 00000110 (Logic for add)
.. ........
13 = 00001101
Mientras que calcular 7+(-6) significa que se utilizará la lógica de resta en su lugar
7 = 00000111
-6 = 10000110 (Logic for subtraction)
.. ........
1 = 00000001
Por lo tanto, el rango para un número de 8 bits es -(2^7)+1 a 2^7-1 (es decir, -127 a +127, con dos ceros +0 y -0). La representación de magnitud con signo se utiliza principalmente para mantener números flotantes.
Y eso lleva a la representación en complemento a dos. Los números positivos se representan de la misma manera que la representación de magnitud con signo. Cambiar el bit de signo requiere dos pasos: (1) Invertir todos los bits (cambiar todos los 0 a 1 y 1 a 0) (2) Agregar uno.
Ejemplo, para obtener la representación de -6 seguimos los siguientes pasos
6 = 00000110
Invert all bits: 11111001
Add one: 11111010
Entonces -6 se representa como 11111010
. Con la representación en complemento a dos, aún puede leer el signo del MSB; mientras que para el cero sólo existe una representación: 00000000
.
También es fácil hacer cálculos con números binarios en representación en complemento a dos: sumar es sumar. Veamos nuevamente cómo funciona calcular 7+(-6):
1111111 Carry bit
7 = 00000111
-6 = 11111010 (Logic for add)
.. ........
1 = 00000001
Por lo tanto, el rango para un número de 8 bits es -(2^7) a 2^7-1 (es decir, -128 a +127). Tenga en cuenta que el rango es diferente de la representación de magnitud con signo.