2009-04-01 20 views
5

Recientemente me confundí por this question. Tal vez porque no leí las especificaciones del lenguaje (es mi culpa, lo sé).Compiladores y representaciones de números negativos

C99 estándar no indica qué representación de números negativos debe usar el compilador. Siempre pensé que la única manera correcta de almacenar números negativos es el complemento de dos (en la mayoría de los casos).

Así que aquí está mi pregunta: ¿conoces algún compilador actual que implemente por defecto el complemento de uno o la representación de magnitud de signo? ¿Podemos cambiar la representación predeterminada con algún indicador de compilación?

¿Cuál es la forma más simple de determinar qué representación se utiliza?

¿Y qué hay del estándar C++?

+0

Creo que se puede determinar qué aplicación es utilizada por el control de la binaria de un valor con signo para su representación, similar a cómo los cheques endianness son hecho. esto probablemente podría hacerse en un #define y evaluado en tiempo de compilación. – slipperyseal

+0

quiero decir, si no ha resuelto este problema en los últimos 6 años. : o – slipperyseal

+0

[¿El complemento es un problema del mundo real, o simplemente uno histórico?] (https://stackoverflow.com/q/161797/995714) –

Respuesta

5

Creo que no es tanto una cuestión de qué representación utiliza el compilador, sino más bien qué representación utiliza la máquina subyacente. El compilador sería muy estúpido para elegir una representación que no sea compatible con la máquina de destino, ya que eso generaría cargas de sobrecarga sin ningún beneficio.

Algunos campos de suma de comprobación en el conjunto de protocolos IP utilizan el complemento de uno, por lo que tal vez la CPU dedicada: "acelerador de red" lo implemente.

+0

¿Hay algún compilador C para CPU de "acelerador de red"? – klew

+0

@klew: No es que pudiera encontrarlo después de unos minutos intensos de búsqueda de Google, pero eso no prueba mucho. :) – unwind

1

Mientras que twos-complement representación es de lejos la más común, no es la única (see some). Los comités de estandarización de C y C++ no querían requerir que las máquinas que no eran de dos en dos emularan una representación no nativa. Por lo tanto, ni C ni C++ requieren un formato entero negativo específico.

Esto conduce al comportamiento indefinido de las operaciones bit a bit en los tipos firmados.

+0

Sí, pero no es por lo que estoy preguntando. ¿Conoces algún compilador de C que usaría por defecto el complemento no-two? – klew

+0

Aquellos para los sistemas que usan complementos que no son de remolque ... que, al parecer, incluyen alguna caja de Unisys que todavía es compatible (esto puede aparecer en el segundo enlace). – Richard

Cuestiones relacionadas