2010-04-18 7 views
6

Tengo un montón de #define en mi código. Ahora ha surgido un problema extraño.El valor de C define cambios inesperadamente

tengo esto:

#define _ImmSign 010100 

(estoy tratando de simular un número binario)

Obviamente, espero que el número se convierta en 10100. Sin embargo, cuando se utiliza el número que se ha transformado en 4160.

¿Qué está pasando aquí? ¿Y cómo lo detengo?

ADICIONAL

bien, así que esto es debido a la lengua interpretar esto como una octal. Sin embargo, ¿hay alguna forma inteligente de forzar el lenguaje para interpretar los números como enteros? Si un 0 define octal y hexadecimal 0x define ahora que lo pienso ...

+3

010100 en octal es 0 * 1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY Esto puede ser útil para usted. aunque C++, creo que es un preprocesador solo – Anycorn

+0

@aaa thx por la sugerencia, pero no creo que se me permita usar una biblioteca de terceros. – NomeN

Respuesta

1

Si usted está dispuesto a escribir código no portátil y utilizar gcc, se puede utilizar la binary constants extension:

#define _ImmSign 0b010100 
+1

argh ... He buscado esta varias veces, pero nunca apareció en google. SO rocas! – NomeN

13

literales enteros que comienzan con un 0 se interpretan como octal, no decimal, de la misma manera que los literales enteros que comienzan con 0x se interpretan como hexadecimal

Elimina el cero inicial y deberías estar listo para empezar.

Tenga en cuenta también que los identificadores que comienzan con un guión bajo seguido de una letra mayúscula u otro guión bajo están reservados para la implementación, por lo que no debe definirlos en su código.

+0

respuesta rápida! ¿Hay alguna otra forma de detener esto y luego eliminar el cero inicial? – NomeN

+2

@NomeN: No; esa es una parte fundamental del lenguaje. –

4

Prefijo de un entero con 0 lo convierte en un número octal en lugar de decimal, y 010100 en octal es 4160 en decimal.

+0

otra respuesta rápida, ¡gracias! ¿Hay alguna otra manera de arreglar esto en lugar de eliminar los 0 principales? – NomeN

+0

No es que yo sepa. – Maulrus

2

No hay sintaxis de números binarios en C, al menos sin alguna extensión de compilación. Lo que se ve es 010100 interpretado como un octal (base 8) Número: se hace cuando un literal numérico empieza con 0.

2

010100 se trata como octal por C debido a la líder 0. Octal 10100 es 4160.

0

octal :-)

Puede encontrar these macros helpful para representar números binarios con números decimales u octales en forma de 1 y 0. Manejan ceros a la izquierda, pero desafortunadamente debes elegir el nombre del macro correcto dependiendo de si tienes un cero inicial o no. No es perfecto, pero espero que sea útil.

Cuestiones relacionadas