2010-07-29 45 views
5

quiero comparar dos hexadecimal (almacenado en largo) a continuación es mi códigoAl comparar dos valores hexadecimales en C++

long constant = 80040e14; 
if(constant == 80040e14) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 

En este control de flujo de código siempre retorna a la parte más, ¿alguien puede sugerir por favor la forma de proceder con la comparación.

Gracias

Santhosha K

+0

me sorprende que compila –

+2

@Binary Worrier: Se elabora sólo con carácter 'e' (ya que se toma como exponente). Para cada otro carácter hexadecimal es un error del compilador. – Naveen

+0

¡LOL ...........! –

Respuesta

13

Prefijo sus constantes con '0x'.

Su constante solo tiene 'e' y el compilador tratará los números del formulario: NNNeEEE como notación científica. El uso del prefijo '0x' le dice al compilador que los siguientes caracteres están en notación hexadecimal.

En su código, 80040e14 es 8004000000000000000 que es demasiado grande para caber en un valor de 32 bits pero puede caber en un valor de 64 bits. Pero 80040e14 es un número de coma flotante, por lo que la comparación convertirá el largo en un flotante para que sea del mismo tipo que la constante, por lo que los dos valores serán diferentes debido a las complejidades del código de coma flotante.

+0

+1 - Esta es la respuesta más completa de todas. – Shaihi

0

¿Desea comparar un hex?
Use 0x80040e14 -> observe el prefijo 0x para que el compilador sepa que es un formato hexadecimal.

La forma en que lo escribe el compilador puede intentar analizarlo como un flotante (e significa exponencial), pero en realidad no lo intenté para ver cómo lo maneja.

+0

Gnu g ++ 4.4.3 muestra esta advertencia: "desbordamiento en la conversión constante implícita" – Kristian

2

Para valores hexadecimales que necesita para prefijar el constante con 0x De lo contrario e se toma como un exponente y el valor se interpreta como un enorme valor decimal . En sus casos, lo más probable es que este valor no se pueda almacenar en mucho tiempo y se desborde. Debido a este desbordamiento, su prueba de comparación falla.

3

Es necesario poner 0x delante de sus números hexadecimales en C++

1

Para comparar dos valores utilizan el operador ==. La única cosa a considerar es decirle al compilador el que la base es el valor usando:

  • decimal: escribir el número como siempre lo hace en la "vida real". Ejemplo: 1 (uno), 2 (dos), 3 (tres), ...

  • Hexadecimal: debe agregar 0x al valor. Ejemplo: 0x01 (uno), 0x02 (dos), 0x03 (tres), ...

  • Binario: añada 0b. Ejemplo: 0b01 (uno), 0xb10 (dos), 0b11 (tres). Editar: parece que esto no es cierto. No confíes en esta característica.

En su ejemplo, acaba de hacer:

long constant = 0x80040e14; 
if(constant == 0x80040e14L) 
    cout<<"Success"<<endl; 
else 
    cout<<"Fail!!"<<endl; 
+0

C++ no tiene un formato binario para literales. Un prefijo '0x' indica hexadecimal, un prefijo '0' denota un número octal. '0b01' y '0b11' generarían errores de compilación ('b' es un carácter octal inválido) y '0xb10' es 2832 en decimal. – Skizz

+0

Vaya, esa es una característica que solo utilicé en C, asumí erróneamente que C++ lo heredó. –

+0

No es C tampoco (posiblemente una extensión del compilador) – MSalters

0

80040e14 es un doble. Cuando se asigna a un largo se convierte en cero. 80040e14L es un doble largo. la expresión

constant == 80040e14L 

promueve constante para un largo doble por lo que tiene

0.0 == 80040e14 
Cuestiones relacionadas