En un TC++ compilador, la representación binaria de 5 es (00000000000000101).
Sé que los números negativos se almacenan como complemento a 2, por lo tanto -5 en binario es (111111111111011). El bit más significativo (bit de signo) es 1, que dice que es un número negativo.

Entonces, ¿cómo es que el compilador sabe que es -5? Si interpretamos el valor binario dado anteriormente (111111111111011) como un número sin signo, será completamente diferente?

También, ¿por qué el 1 elogio de la 5 -6 (1111111111111010)?

OriginalEl autor paragjain | 2009-03-17

8 Comentarios

  1. 8

    El compilador no sabe. Si lanzas -5 a unsigned int obtendrá 32763.

    Sí, el elenco le dice al compilador cómo interpretar los bits en un determinado lugar de la memoria. Generalmente tiene su propia idea de lo que reside donde, pero un elenco arroja una llave en las cosas.
    Bien, usted incluso no tiene que hacer explícito emitidos.
    sí, el compilador sólo hace la matemáticas. si u elenco de -5 a unsigned int, el resultado es siempre UINT_MAX+1-5, si tiene signo-magnitud/dos-complemento/un complemento es irrelevante.
    Espera, ¿eso no significa que el compilador no sabes? La cpu sólo hace la matemáticas y el compilador interpreta el resultado como con o sin signo. Es ese derecho?
    Si yo uso signed int a = 2 , entonces, ¿cómo el compilador sabe que es un número negativo o un número positivo?

    OriginalEl autor vartec

  2. 5

    El compilador sabe porque esta es la convención de la CPU utiliza de forma nativa. El equipo tiene una CPU que almacena los números negativos en complemento a dos de notación, por lo que el compilador sigue. Si su CPU admite un complemento a la notación, el compilador podría utilizarlos (como es el caso de la IEEE flota, por cierto).

    El artículo de Wikipedia sobre el tema se explica cómo complemento a dos funciona la notación.

    +1: Citar algunos útiles docs; +1: es el hardware; +1: el compilador no «sabe» nada acerca de la cantidad, se ha declarado firmado o sin firmar — usted tiene que utilice de forma coherente con la declaración.

    OriginalEl autor greyfade

  3. 3

    El procesador implementa firmados y sin firmar instrucciones, que operará en la representación de números binarios de manera diferente. El compilador sabe que de estas instrucciones para emitir basado en el tipo de los operandos involucrados (es decir, int vs unsigned int).

    Que el compilador no necesita saber si un número es negativo o no, simplemente emite la máquina correcta o lenguaje intermedio de instrucciones para los tipos involucrados. El procesador o el tiempo de ejecución de la aplicación de estas instrucciones, en general, no importa mucho si el número es negativo o no sea, como en la formulación de complemento a dos de la aritmética es tal que no es el mismo para los números positivos o negativos (de hecho, esta es la principal ventaja de complemento a dos de la aritmética). Lo sería necesitan saber si un número es negativo sería algo así como printf(), y como Andrew Jaffe señalado, el MSBit que se establece es indicativo de un número negativo en complemento a dos.

    Si escribo signed int a = -1 , a continuación, ` -1` en complemento a 2 del formulario es 11111111 11111111 11111111 11111111 y, a continuación, cuando utilizo %d para interpretar lo que se imprime -1 y %u , imprime 4294967295 y cuando escribo signed int a = 2 , imprime 2 cuando utilizo %d y también cuando utilizo %u . Si 2 sería en complemento a dos sería 11111111 11111111 11111111 11111101 , y entonces sería una muy diffr respuesta , lo que yo realmente quiero preguntar es ¿cuándo complemento a 2 pasará es que dependen de firmar o sucede para cada entero si es de tipo signed int, el cual no debe ser el caso aquí.

    OriginalEl autor Matt J

  4. 2

    El primer bit se establece sólo para los números negativos (que así se llama el bit de signo)

    Información detallada está disponible aquí

    Pero para unsigned int primer bit puede ser, y lo es todavía un número positivo.

    OriginalEl autor Brann

  5. 2

    La kewl parte de complemento a dos es que el lenguaje de la máquina sumar y Restar instrucciones puede ignorar todo eso, y acaba de hacer la aritmética binaria y simplemente funciona…

    es decir, -3 + 4

    Binario en complemento a 2, es

       1111 1111 1111 1101   (-3)
    +  0000 0000 0000 0100   ( 4)
       -------------------
       0000 0000 0000 0001   ( 1)
    Sabes, me había olvidado por completo de que la propiedad de complemento a 2. Esa es, probablemente, otra buena razón por la que fue inventado.
    exactamente la razón
    Si escribo signed int a = -1 , entonces -1 en complemento a 2 del formulario es 11111111 11111111 11111111 11111111 y, a continuación, cuando utilizo %d para interpretar lo que se imprime -1 y %u , imprime 4294967295 y cuando escribo signed int a = 2 , imprime 2 cuando yo uso %d y también cuando uso %u . Si 2 sería en complemento a dos sería 11111111 11111111 11111111 11111101 , y entonces sería una muy diffrenet respuesta , lo que yo realmente quiero preguntar es ¿cuándo complemento a 2 pasará es que dependen de firmar o sucede para cada entero si es de tipo signed int, el cual no debe ser el caso aquí.

    OriginalEl autor Charles Bretana

  6. 2

    veamos un ejemplo:
    tenemos dos números de dos bytes en binario:
    A = 10010111
    B = 00100110
    (tenga en cuenta que la máquina no conoce el concepto de firmado o sin firmar en este nivel)

    ahora, cuando usted dice «agregar» estos dos, ¿qué hace la máquina? simplemente añade:

    R = 10111101 (y llevar bits : 1)

    ahora, nosotros-como compilador – necesidad de interpretar la operación. tenemos dos opciones: los números pueden ser con o sin signo.

    1 – unsigned caso: en c, los números son de tipo «unsigned char» y los valores son 151 y 38 y el resultado es de 189. este es trivial.

    2 – firmado caso: nosotros, el compilador, interpretar los números de acuerdo a su msb y el primer número es -105 y la segunda es todavía 38. así -105 + 38 = -67. Pero -67 es 10111101. Pero esto es lo que ya tenemos en el resultado (R)! El resultado es el mismo, la única diferencia es la forma en que el compilador interpreta.

    La conclusión es que, no importa cómo tenemos en cuenta los números, la máquina hace la misma operación en los números. Pero el compilador de interpretar los resultados en su turno.

    Tenga en cuenta que, no es la máquina que conoce el concepto de complemento a 2. solamente la suma de dos números sin importar el contenido. El compilador, a continuación, examina el bit de signo y decide.

    Cuando se trata de la sustracción, esta vez, de nuevo, la operación es única: tomar el complemento a 2 del segundo número y agregar los dos.

    OriginalEl autor Atilla Baspinar

  7. 1

    Si el número está declarada como una firma de tipo de datos (y no el tipo de convertir en un entero de tipo), entonces el compilador sabe que, cuando el bit de signo es 1, es un número negativo. En cuanto a por qué complemento a 2 se utiliza en lugar de complemento a 1, no quieres ser capaz de tener un valor de -0, que en complemento a 1 le permitirá hacer, así que se inventó el complemento a 2 para arreglar eso.

    Creo que la verdadera razón era permitir que el lenguaje de máquina sumar/restar los algoritmos de ignorar el signo de la oeprands y simplemente hacer un bit a bit de la suma o la resta, la realización de bits cuando sea necesario…

    OriginalEl autor RobH

  8. 0

    Es exactamente que el bit más significativo — si usted sabe que un número está firmado, entonces, si la MSB=1 el compilador (y el tiempo de ejecución!) sabe interpretar como negativo. Esta es la razón por la c-como las lenguas tienen ambos números enteros (positivos y negativos) y los enteros sin signo-en el caso de que usted interpretar todos ellos positivos. Por lo tanto, un byte con signo va desde -128 a 127, pero un byte sin signo entre 0 y 255.

    En realidad, un byte con signo va desde -128 a 127.

    OriginalEl autor Andrew Jaffe

Dejar respuesta

Please enter your comment!
Please enter your name here