2010-07-29 9 views
5

Chcę porównać dwa szesnastkowo (przechowywane w długi) poniżej jest mój kodPorównując dwie wartości szesnastkowej w C++

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

W tej kontroli przepływu kodu zawsze powraca do innego części, może ktoś proszę sugerują, jak postępować z porównaniem.

Dzięki

Santhosha K

+0

Dziwię kompiluje –

+2

@Binary Worrier: To kompiluje tylko 'e' charakteru (jak to jest traktowane jako wykładnik potęgowy). Dla każdego innego znaku szesnastkowego jest to błąd kompilatora. – Naveen

+0

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

Odpowiedz

13

Prefiks swoimi stałymi z '0x'.

Twoja stała ma tylko "e", a kompilator będzie traktował liczby w postaci: NNNeEEE jako notację naukową. Użycie prefiksu "0x" mówi kompilatorowi, że następujące znaki są zapisane w zapisie heksadecymalnym.

W kodzie 80040e14 to 8004000000000000000, który jest zbyt duży, aby zmieścić się w wartości 32-bitowej, ale może zmieścić się w wartości 64-bitowej. Ale 80040e14 to liczba zmiennoprzecinkowa, więc porównanie zamieni wartość long na float, aby stała się tym samym typem co stała, a więc dwie wartości będą różne ze względu na złożoność kodu zmiennoprzecinkowego.

+0

+1 - Jest to najbardziej kompletna odpowiedź ze wszystkich. – Shaihi

0

Czy chcesz porównać heks?
Użyj 0x80040e14 -> zauważ prefiks 0x, aby kompilator wiedział, że jest w formacie szesnastkowym.

Sposób, w jaki to piszesz, może próbować parsować go jako float (e, oznaczający wykładniczy), ale tak naprawdę nie próbowałem go zobaczyć, jak to obsługuje.

+0

Gnu g ++ 4.4.3 wyświetla następujące ostrzeżenie: "przepełnienie w ukrytej stałej konwersji" – Kristian

2

Dla wartości szesnastkowych należy poprzedzić stała z 0x Inaczej e jest traktowana jako wykładnik, a wartość jest interpretowana jako ogromny dziesiętnych wartości. W twoich przypadkach najprawdopodobniej ta wartość nie może być przechowywana długo i przepełnia. Z powodu tego przekroczenia, sprawdzenie porównawcze nie powiedzie się.

3

Musisz umieścić 0x przed swoimi szesnastkowej w C++

1

Aby porównać dwie wartości użyć operatora ==. Jedyną rzeczą do rozważenia jest informacją kompilator który bazowa jest wartość używając:

  • dziesiętny: zapisz numer jak zawsze robisz w „prawdziwym życiu”. Przykład: 1 (jeden), 2 (dwa), 3 (trzy), ...

  • Szesnastkowy: Musisz dodać 0x do wartości. Przykład: 0x01 (jeden), 0x02 (dwa), 0x03 (trzy), ...

  • Binarny: Dołącz 0b. Przykład: 0b01 (jeden), 0xb10 (dwa), 0b11 (trzy). Edycja: wydaje się, że to nie jest prawda. Nie ufaj tej funkcji.

W przykładzie po prostu zrobić:

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

C++ nie ma formatu binarnego dla literałów. Prefiks "0x" oznacza szesnastkowy, prefiks "0" oznacza liczbę ósemkową. "0b01" i "0b11" będą generować zarówno błędy kompilatora ("b" jest niepoprawnym znakiem ósemkowym), a "0xb10" ma wartość 2832 w systemie dziesiętnym. – Skizz

+0

Ups, to jest funkcja, której użyłem tylko w C, błędnie założyłem, że C++ ją odziedziczył. –

+0

To nie jest C (prawdopodobnie rozszerzenie kompilatora). – MSalters

0

80040e14 jest podwójne. Po przypisaniu do długiego staje się zero. 80040e14L jest długim podwójnym. wyrażenie

constant == 80040e14L 

promuje stałe do long double więc trzeba

0.0 == 80040e14 
Powiązane problemy