Pregunta

El estándar ISO C permite tres métodos de codificación para los enteros con signo:. Complemento a dos, el complemento a uno y el signo / magnitud

¿Cuál es una manera eficiente o bien para detectar la codificación en tiempo de ejecución (o algún otro momento si hay una solución mejor)? Quiero saber esto para que pueda optimizar una biblioteca número grande de las diferentes posibilidades.

Me planear en el cálculo de este y almacenarla en una variable cada vez que se ejecuta el programa por lo que no tiene por qué ser tan rápidos - Asumo la codificación no va a cambiar durante la ejecución del programa: -)

¿Fue útil?

Solución

Usted sólo tiene que comprobar los bits de orden inferior de la -1 constante con algo así como -1 & 3. Esto se evalúa como

  1. para el signo y magnitud,
  2. para la propia complemento y
  3. de complemento a dos.

Esto incluso debería ser posible hacer en una expresión preprocesador dentro construcciones #if #else.

Otros consejos

de la detección de uno complemento debe ser bastante simple - algo así como if (-x == ~x). La detección de complemento a dos debería ser casi tan fácil: if (-x == ~x + 1). Si se trata de ninguno de esos, entonces debe ser signo / magnitud.

¿Por qué no hacerlo en tiempo de compilación? Usted podría tener el programa de pruebas de scripts de construcción / Makefile compilar una si es necesario, pero luego utiliza el preprocesador de hacer la compilación condicional. Este rendimiento también significa es más menos importante, ya que sólo se ejecuta una vez por cada compilación, en lugar de una vez por ciclo.

Obtener un puntero a un int a que mostraría un patrón de bits distintivo. Proyectarlo como un puntero a entero sin signo y luego examinar los valores de bit.

Hacer esto con un par de valores cuidadosamente seleccionados debe hacer lo que quiera.

supongo que le guarda un número negativo como int en una gama lo suficientemente grande como para contener char y comparar la matriz con las diversas representaciones de averiguarlo.

Pero uhm ... sin firmar enteros no deben tener una señal, ¿verdad?

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