Pregunta

Estoy más que a mitad de camino a través del conjunto de aprendizaje y estoy familiarizado con el concepto de cómo firmados y enteros sin signo se presentan en bits, sé que podría parecer una pregunta extraña de lo que la respuesta sería bastante obvio, pero me pregunto si se utiliza una operación aritmética como además tiene sentido para un par de números que uno de ellos se considera firmado y el otro sin firmar, he pensado en múltiples ejemplos como a continuación que producirá un resultado correcto:

10000001 (número entero de 1 byte sin signo y considerado, equivalente a 129)
+
11111111 (número entero de 1 byte y considerado firmado (sistema de complemento de dos), equivalente a -1)


10000000 (número entero de 1 byte sin signo y en la lógica equivalente a 128)

Ahora bien, si el valor superior estaba en registro AL y tuvimos el código de instrucción siguiente (en formato GAS):

addb -1, %al

A continuación, la bandera de acarreo (CF) de EFLAGS se establecerá registro después se ha hecho de la operación e informaría de un desbordamiento de que en realidad no ha sucedido y tal vez porque hay un número sin signo en términos de un desbordamiento de la bandera de desbordamiento (OF) de registro EFLAGS debe ser referenciado. Así que estoy confundido si el hacer tal cosa es siempre sensible.

¿Fue útil?

Solución 5

Me pareció muy bonito artículo en el tema que era mi principal preocupación y la respuesta es clara después de leer el artículo.

Otros consejos

Matemáticamente, no agrega firmado o número sin signo. No son sólo valores de módulo 2 32 (asumiendo que tiene registros de 32 bits). Tales valores cubren un rango de 2 32 enteros consecutivos, pero usted es libre de interpretar que el rango que comienza en cualquier lugar. "Firmado" y "sin firmar" son sólo dos de estas interpretaciones.

En otras palabras, con registros de 4 bits, sin signo de la interpretación de "1011" es de once, mientras que la interpretación firmado es de menos de cinco años. Pero sólo hay un valor (que los matemáticos suelen llamar "once módulo 2 4 " porque los matemáticos son tradicionalmente aficionado a la interpretación sin firmar). Por ejemplo, si se agrega "0110" a ese valor (que es "seis" en ambas interpretaciones con y sin signo), entonces se obtiene "0001", que es el valor adecuado: menos cinco más seis uno rendimiento, y once más seis es diecisiete, que también es igual a uno cuando se reduce módulo 2 4 (diecisiete es uno más de dieciséis; "la reducción de módulo 2 4 " es aproximadamente dividiendo por dieciséis [que es 2 < sup> 4 ] y mantener sólo el resto).

Otra forma de decir que es la siguiente: el número de dígitos binarios () por un valor numérico es conceptualmente infinita hacia la izquierda. El registro de la CPU sólo mantiene los 32 bits de la derecha. La interpretación sin signo es la hora de asumir, convencionalmente, que todos los bits de la izquierda son cero. La interpretación firmado se trata de asumir, convencionalmente, que todos los bits de la izquierda tienen el mismo valor que el bit 31 (es decir, todos son cero, o todos son uno). De cualquier manera, cuando se realiza una adición (o una resta o una multiplicación), lleva a propagarse de derecha a izquierda, no a la inversa, por lo que los valores de los bits ignorados no tienen relación alguna con el resultado de 32 bits. Así que sólo hay un "add" código de operación, lo que no le importa lo más mínimo acerca de si sus operandos son, en el cerebro del programador, "firmado" o "sin firmar".

de signo debe tenerse en cuenta a la hora de realizar una operación que es no compatible con la aritmética de módulo. La conversión en una secuencia de dígitos decimales para la visualización es tal operación. Un caso más frecuente, sin embargo, es la comparación. Los valores de módulo 2 32 no están ordenados; que están en una especie de bucle cíclico (cuando se agrega 1 a 2 32 -1, y reducir el módulo 2 32 , se obtiene de nuevo a 0). Las comparaciones sólo tienen sentido si tenemos en cuenta enteros en todo el rango de números enteros. En ese punto, se debe decidir si se utiliza la interpretación con o sin signo. Razón por la cual x 86 procesadores ofrecen tanto jg (salto si es mayor, firmado interpretación) y ja (salto si es superior, la interpretación sin firmar).

Si un número u operación está firmado o no firmado es sólo una cuestión de interpretación. ¿Qué pasará cuando lo hace el complemento es que los números que los dos se añaden juntos para hacer 10000000 con un 1 en el indicador de acarreo (ya que “se salió de la parte delantera”). Es entonces hasta sus posteriores operaciones de interpretar lo que eso significa (si se utiliza el bit en otro lugar, es como se está tratando la operación como un complemento sin firmar y sin envoltura; si tiras el bit de distancia, es como si estuviera haciendo un iniciado sesión añadir).

A nivel binario, sólo hay una operación de adición:

 0101 + (5)
 1010 = (unsigned 10 or signed -6)
--------
 1111   (unsigned 15 or signed -1)

¿Qué pasa con las banderas de transportar y de desbordamiento, ambos están configurados de acuerdo con reglas simples. CF se puede utilizar para detectar un oveflow si y sólo si tenemos en cuenta que los operandos estaban sin firmar, y de detectar la oveflow si y sólo si consideramos tanto de ellos firmaron. Ambos indicadores se establecen de acuerdo con el resultado, y le toca a usted para decidir cuál de ellos utilizar.

La fórmula real para de la bandera es

OF = CF xor MSB_of_result.

Esto significa que si estamos añadiendo dos números positivos (que consideramos firmado), a continuación, si el resultado es negativo, entonces oveflowed.

"Firmado" y "sin firmar" son interpretaciones. Una instrucción de montaje tendrá generalmente la interpretación documentada. No estoy al tanto de cualquier arquitectura donde hay una instrucción ADD-SIGNED-UNSIGNED que interpreta uno de sus argumentos como un valor firmado y uno como sin signo. Parece que hay poco valor en ella, también. Con 2s complementan aritmética de enteros, la única diferencia sería en algunos registros de señalización de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top