¿Entiende el código original, el código inverso y el código complementario en la programación en lenguaje C?

1. Números de máquina y valores de verdad

Antes de aprender el código original, el código inverso y el código complementario, debe comprender los conceptos de números de máquina y valores de verdad.

1. Número de máquinas

La representación binaria de un número en una computadora se llama el número de máquina del número. El número de máquina está firmado y el bit más alto de un número se usa para almacenar el signo en la computadora, el número positivo es 0 y el número negativo es 1.

Por ejemplo, el número +3 en decimal, la longitud de la palabra de la computadora es de 8 bits y convertido a binario es 00000011. Si es -3, es 10000011.

Luego, 00000011 y 10000011 son los números de máquina.

2. Valor verdadero

Debido a que el primer bit es el bit de signo, el valor formal del número de máquina no es igual al valor real. Por ejemplo, en el número con signo anterior 10000011, el bit más alto 1 representa negativo, y su valor real es -3 en lugar del valor formal 131 (10000011 convertido a decimal es igual a 131). Por lo tanto, a efectos de distinción, el valor real correspondiente al número de máquina con el bit con signo se denomina valor real del número de máquina.

Ejemplo: valor verdadero de 0000 0001 = +000 0001 = +1, valor verdadero de 1000 0001 = –000 0001 = –1

2. Conceptos básicos y métodos de cálculo de código original, código inverso y código complemento.

Antes de explorar por qué la máquina usa el código de complemento, primero comprendamos el concepto del código original, el código de complemento y el código de complemento. Para un número, la computadora debe usar un método de codificación determinado para almacenar. El código original, el código de complemento , y el código de complemento son almacenamiento de máquina Un método de codificación para un número específico.

1. Código original

El código original es el valor absoluto del bit de signo más el valor verdadero, es decir, el primer bit se usa para representar el signo y los bits restantes representan el valor, por ejemplo, si es binario de 8 bits:

[+1] Original = 0000 0001

[-1] originales = 1000 0001

El primer bit es el bit de signo. Debido a que el primer bit es el bit de signo, el rango de valores del número binario de 8 bits es:

[1111 1111 , 0111 1111]

Ahora mismo

[-127 , 127]

El código original es la representación más fácil de entender y calcular para el cerebro humano.

2. Código inverso

El método de representación inversa es:

El complemento a uno de un número positivo es él mismo

El código inverso de un número negativo se basa en el código original, el bit de signo permanece sin cambios y el resto de los bits se invierten.

[+1] = [00000001] Original = [00000001] Anti

[-1] = [10000001] original = [11111110] contra

Se puede ver que si un código negativo representa un número negativo, el cerebro humano no puede ver intuitivamente su valor, por lo general, debe convertirse al código original antes del cálculo.

3. Código de complemento

La notación en complemento a dos es:

El complemento de un numero positivo es el mismo

El código de complemento de un número negativo se basa en el código original, el bit de signo permanece sin cambios, y el resto de los bits se invierten, y finalmente +1 (es decir, +1 sobre la base del código de complemento)

[+1] = [00000001] original = [00000001] inverso = [00000001] complemento

[-1] = [10000001] original = [11111110] inversa = [11111111] complemento

Para los números negativos, la representación del código de complemento también es imposible para el cerebro humano para ver el valor intuitivamente. Por lo general, debe convertirse al código original para calcular el valor.

3. ¿Por qué usar código original, código inverso y código complementario?

Antes de comenzar el estudio en profundidad, mi sugerencia de aprendizaje es "memorizar" el código original anterior, el código inverso y el método de cálculo y representación del código complementario.

Ahora sabemos que la computadora puede expresar un número de tres formas de codificación. Para números positivos, los resultados de los tres métodos de codificación son los mismos:

[+1] = [00000001] original = [00000001] inverso = [00000001] complemento

Así que no hay necesidad de explicar demasiado, pero para números negativos:

[-1] = [10000001] original = [11111110] inversa = [11111111] complemento

Se puede ver que el código original, el código inverso y el código complementario son completamente diferentes. Dado que el cerebro humano reconoce directamente el código original y lo utiliza para calcular la expresión, ¿por qué todavía hay código inverso y código complementario?

En primer lugar, debido a que el cerebro humano puede saber que el primer bit es el bit de signo, elegiremos la suma y resta del área de valor real de acuerdo con el bit de signo al calcular (el concepto de valor real está al principio de este artículo). Pero para las computadoras, la multiplicación de sumas y restas ya es la operación más básica, y debe diseñarse lo más simple posible. La identificación de la computadora del "bit de signo" obviamente hará que el diseño del circuito básico de la computadora sea muy complicado. ! Así que a la gente se le ocurrió un método para usar el bit de signo para participar en la operación. Sabemos que, según el algoritmo, restar un número positivo es igual a sumar un número negativo, es decir: 1-1 = 1 + (- 1) = 0, por lo que la máquina solo puede sumar pero no restar, por lo que el diseño de las operaciones de la computadora es más simple.

Entonces, la gente comenzó a explorar el método de usar el bit de signo para participar en la operación y solo retener la adición.Primero mire el código original:

Calcula la expresión decimal: 1-1=0

1 - 1 = 1 + (-1) = [00000001] bruto + [10000001] bruto = [10000010] bruto = -2

Si está representado por el código original, y el bit de signo también está involucrado en el cálculo, obviamente para la resta, el resultado es incorrecto, es por eso que la computadora no usa el código original para representar un número.

Para resolver el problema de restar el código original, existe un código inverso:

Calcula la expresión decimal: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001] original + [1000 0001] original = [0000 0001] original + [1111 1110] original = [1111 1111] original = [1000 0000] original = -0

Se encuentra que el valor de verdad del resultado es correcto cuando se usa el complemento de uno para calcular la resta. El único problema es en realidad el valor especial "0". Aunque la gente entiende que +0 y -0 son lo mismo, pero 0 tiene un signo No tiene significado Y habrá [0000 0000] original y [1000 0000] dos códigos originales para representar 0.

Entonces, la aparición del código complemento resuelve el problema del signo de 0 y dos codificaciones:

1-1 = 1 + (-1) = [0000 0001] original + [1000 0001] original = [0000 0001] complemento + [1111 1111] complemento = [0000 0000] complemento = [0000 0000] original

De esta forma el 0 se representa por [0000 0000], y el -0 que antes tenia problemas no existe y se puede representar por [1000 0000] -128:

(-1) + (-127) = [1000 0001] original + [1111 1111] original = [1111 1111] complemento + [1000 0001] complemento = [1000 0000] complemento

El resultado de -1-127 debería ser -128. En el resultado de la operación del código de complemento, el complemento [1000 0000] es -128. Pero tenga en cuenta que debido a que el código de complemento -0 anterior en realidad se usa para representar -128, entonces- 128 no tiene código original ni representación de código inverso (la representación del código complementario de -128 [1000 0000] complementa el código original es [0000 0000] código original, que es incorrecto)

Usando código complemento, no solo corrige el signo de 0 y el problema de dos codificaciones, sino que también puede expresar un número mínimo, es por eso que el rango del binario de 8 bits, usando el código original o código inverso, es [-127, + 127], mientras que el rango representado por el complemento a dos es [-128, 127].

Debido a que la máquina usa código de complemento, para el tipo int de 32 bits comúnmente usado en programación, el rango que se puede representar es: [-231, 231-1] porque el primer bit representa el bit de signo. Y cuando se usa código de complemento representación, puede haber más Guardar un valor mínimo.

4. Código original, código inverso, código complementario y luego profundizar

La computadora inteligentemente usa el bit de signo para participar en la operación y convierte la resta en suma ¿Qué tipo de principio matemático hay detrás?

Piense en un reloj como un número hexadecimal de 1 dígito. Si la hora actual es las 6 en punto y quiero configurar la hora para las 4 en punto, ¿qué debo hacer? Podemos:

1. Volver a marcar 2 horas: 6 - 2 = 4

2. Marque adelante 10 horas: (6 + 10) mod 12 = 4

3. Marque adelante 10+12=22 horas: (6+22) mod 12 =4

El mod en el método 2,3 se refiere a la operación de módulo, 16 mod 12 = 4 significa que el resto después de dividir 16 por 12 es 4.

¡Así que el resultado de que el reloj retroceda (resta) se puede reemplazar girándolo hacia adelante (suma)!

Ahora el enfoque está en cómo reemplazar un número negativo con un número positivo. En el ejemplo anterior, podemos sentir algunas pistas y descubrir algunas leyes. Pero las matemáticas son rigurosas y no podemos confiar en los sentimientos.

Primero introduzca un concepto relacionado en matemáticas: congruencia

concepto de congruencia

Dos enteros a, b, si dividen el resto por el entero m son iguales, entonces se dice que a, b son congruentes módulo m

Escribe a ≡ b (mod m)

Se lee como a y b congruentes módulo m.

Por ejemplo:

4 módulos 12 = 4

16 módulo 12 = 4

28 módulo 12 = 4

entonces:

7 ≡ 7 (mod. 12)

(-2) ≡ 10 (módulo 12)

7 -2 ≡ 7 + 10 (módulo 12)

Ahora encontramos su número congruente positivo para un número negativo, pero no es 7-2 = 7+10, sino 7 -2 ≡ 7 + 10 (mod 12), es decir, el resto del resultado del cálculo es igual.

A continuación, volvamos al problema del binario, echemos un vistazo: el problema de 2-1=1.

2-1=2+(-1) = [0000 0010] bruto + [1000 0001] bruto = [0000 0010] inverso + [1111 1110] inverso

Llegue a este paso primero, el código inverso de -1 significa 1111 1110. Si [1111 1110] se considera como el código original aquí, entonces el código original de [1111 1110] = -126, y el bit de signo se elimina aquí, es decir, se considera que es 126.

Se encontraron las siguientes reglas:

(-1) módulo 127 = 126

126 módulo 127 = 126

Ahora mismo:

(-1) ≡ 126 (módulo 127)

2-1 ≡ 2+126 (módulo 127)

¡2-1 es lo mismo que el resto de 2+126!, y este resto es el resultado del cálculo de nuestra expectativa: 2-1=1

Por lo tanto, el código inverso de un número es en realidad el número congruente de este número con respecto a una membrana. Y esta membrana no es nuestro sistema binario, ¡sino el valor máximo que se puede representar! Se puede encontrar un valor correcto dentro del rango representable !

Y 2+126 es obviamente equivalente a una vuelta del reloj, y debido a que el bit de signo está involucrado en el cálculo, se forma el resultado de la operación correcta con el bit de desbordamiento más alto.

Dado que el código de complemento puede convertir la resta en suma, ¿qué pasa con el código de complemento que usan las computadoras ahora? ¿Por qué al sumar 1 al código de complemento aún se puede obtener el resultado correcto?

2-1=2+(-1) = [0000 0010] original + [1000 0001] original = [0000 0010] complemento + [1111 1111] complemento

Si se considera que [1111 1111] es el código original y se elimina el bit de signo, entonces:

[0111 1111] Originales = 127

De hecho, +1 sobre la base del código inverso es equivalente a aumentar el valor de la membrana:

(-1) módulo 128 = 127

127 módulo 128 = 127

2-1 ≡ 2+127 (módulo 128)

En este momento, el dial equivale a girar una vez cada escalas 128. Por lo tanto, los valores mínimo y máximo de los resultados de la operación expresados ​​​​en código de complemento deben ser [-128, 128].

Pero debido al caso especial de 0, no hay forma de representar 128, por lo que el rango de valores del código complementario es [-128, 127]

Mírame para obtener un conjunto completo de material de código fuente: 725022484 Vamos, espacio personal de Xiaoyu - Vamos, vamos Página de inicio personal de Xiaoyu - 哔哩哔哩Video哔哩哔里 Vamos, espacio personal de Xiaoyu, proporciona Xiaoyu Vamos y comparte Para videos , audios, artículos, dinámicas, favoritos y demás contenido, sigue la cuenta Xiaoyu Come on, y sé el primero en enterarte de las dinámicas de UP. Grupo de aprendizaje de programación: 725022484 Comparta un pequeño juego de programación todos los días ~ Materiales de código fuente del juego C / C ++ y varios paquetes de instalación, ¡los mensajes privados no se ven a menudo! https://space.bilibili.com/1827181878?spm_id_from=333.788.0.0

Supongo que te gusta

Origin blog.csdn.net/yx5666/article/details/129086086
Recomendado
Clasificación