2010-07-29 13 views
5

voglio mettere a confronto due esadecimale (immagazzinate nella lunga) sotto è il mio codiceConfrontando due valori esadecimali in C++

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

In questo controllo di flusso codice restituisce sempre a parte il resto, Qualcuno può suggerire come procedere con il confronto.

Grazie

Santhosha K

+0

Sono sorpreso compila –

+2

@Binary Worrier: compila solo con 'carattere e' (come si è preso come esponente). Per ogni altro carattere esadecimale è un errore del compilatore. – Naveen

+0

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

risposta

13

prefisso vostri costanti con '0x'.

La tua costante ha solo "e" e il compilatore tratterà i numeri del modulo: NNNeEEE come notazione scientifica. L'uso del prefisso '0x' dice al compilatore che i seguenti caratteri sono in notazione esadecimale.

Nel codice, 80040e14 è 8004000000000000000 che è troppo grande per adattarsi al valore a 32 bit ma può essere inserito in un valore a 64 bit. Ma, 80040e14 è un numero a virgola mobile, quindi il confronto convertirà il long a un float per renderlo dello stesso tipo della costante e quindi i due valori saranno diversi a causa delle complessità del codice a virgola mobile.

+0

+1 - Questa è la risposta più completa di tutte. – Shaihi

0

Vuoi confrontare un esagono?
Utilizzare 0x80040e14 -> notare il prefisso 0x per consentire al compilatore di sapere che è in formato esadecimale.

Il modo in cui lo scrivi il compilatore può provare ad analizzarlo come un float (che significa esponenziale), ma in realtà non l'ho provato per vedere come lo gestisce.

+0

Gnu g ++ 4.4.3 fornisce questo avviso: "overflow nella conversione costante implicita" – Kristian

2

Per i valori esadecimali è necessario premettere il costante con 0x Altrimenti e è preso come esponente e il valore viene interpretato come un enorme valore decimale . Nei tuoi casi, molto probabilmente questo valore non può essere memorizzato in un lungo e trabocca. A causa di questo overflow, il controllo comparativo fallisce.

3

è necessario mettere 0x davanti ai vostri numeri esadecimali in C++

1

Per confrontare due valori utilizzano l'operatore ==. L'unica cosa da considerare sta dicendo il compilatore, che di base è il valore con:

  • decimale: scrivere il numero come sempre si fa nella "vita reale". Esempio: 1 (uno), 2 (due), 3 (tre), ...

  • Esadecimale: è necessario aggiungere 0x al valore. Esempio: 0x01 (uno), 0x02 (due), 0x03 (tre), ...

  • Binario: Aggiungi 0b. Esempio: 0b01 (uno), 0xb10 (due), 0b11 (tre). Modifica: sembra che questo non sia vero. Non fidarti di questa funzione.

Nel tuo esempio, basta fare:

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

Il C++ non ha un formato binario per i letterali. Un prefisso '0x' indica esadecimale, un prefisso '0' indica un numero ottale. '0b01' e '0b11' genererebbero entrambi errori del compilatore ('b' è un carattere ottale non valido) e '0xb10' è 2832 in decimale. – Skizz

+0

Oops, questa è una caratteristica che ho usato solo in C, ho assunto erroneamente che il C++ l'abbia ereditata. –

+0

Non è nemmeno C (forse un'estensione del compilatore) – MSalters

0

80040e14 è un doppio. Quando assegnato a un lungo diventa zero. 80040e14L è un lungo doppio. l'espressione

constant == 80040e14L 

promuove costante per un lungo doppio in modo da avere

0.0 == 80040e14 
Problemi correlati