2010-07-29 3 views
5

Я хочу, чтобы сравнить два шестнадцатеричные (хранящийся в длине) ниже мой кодСравнение два шестнадцатеричных значений в C++

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

В этом управлении потоком кода всегда возвращается к другой части, может кто-нибудь предложить, пожалуйста, как поступить с сравнением.

Благодаря

Santhosha K

+0

Я удивлен, что компилирует –

+2

@Binary Worrier: Он собирает только с 'é' характер (как это принято в показатель). Для каждого другого шестнадцатеричного символа это ошибка компилятора. – Naveen

+0

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

ответ

13

Префикс ваши константы с '0x'.

Ваша константа имеет только «e», а компилятор будет обрабатывать номера формы: NNNeEEE как научное обозначение. Использование префикса '0x' сообщает компилятору, что следующие символы имеют шестнадцатеричную нотацию.

В вашем коде 80040e14 имеет номер 8004000000000000000, который слишком велик, чтобы вписаться в 32-битное значение, но может поместиться в 64-битное значение. Но 80040e14 - число с плавающей запятой, поэтому сравнение будет преобразовывать long в float, чтобы сделать его тем же типом, что и константа, и поэтому два значения будут отличаться из-за сложностей кода с плавающей точкой.

+0

+1 - Это самый полный ответ. – Shaihi

0

Вы хотите сравнить гексагон?
Используйте 0x80040e14 -> обратите внимание на префикс 0x, чтобы компилятор знал, что это шестнадцатеричный формат.

Как вы его пишете, компилятор может попытаться разобрать его как float (e значение экспоненциального), но я на самом деле не пытался его увидеть, как он справляется с этим.

+0

Gnu g ++ 4.4.3 дает это предупреждение: «переполнение в неявном постоянном преобразовании» – Kristian

2

Для шестнадцатеричных значений необходимо префикс константы с 0x В противном случае e берется в качестве показателя, а значение интерпретируется как огромный десятичного значение. В ваших случаях, скорее всего, это значение не может быть сохранено в течение длительного времени и переполнено. Из-за этого переполнения проверка сравнения не выполняется.

3

Вам нужно поставить 0x перед вашими шестнадцатеричных чисел в C++

1

Для сравнения двух значений с помощью оператора ==. Единственное, что нужно учитывать говорит компилятору, какая база является значением с помощью:

  • Decimal: записать номер, как всегда вы делаете в «реальной жизни». Пример: 1 (один), 2 (два), 3 (три), ...

  • Шестнадцатеричный: вы должны добавить 0x к значению. Пример: 0x01 (один), 0x02 (два), 0x03 (три), ...

  • Двоичный: Добавить 0b. Пример: 0b01 (один), 0xb10 (два), 0b11 (три). Редактировать: похоже, что это не так. Не верьте этой функции.

В вашем примере, просто сделать:

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

C++ не имеет бинарного формата для литералов. Префикс '0x' указывает шестнадцатеричный, префикс '0' обозначает восьмеричное число. «0b01» и «0b11» будут генерировать ошибки компилятора («b» - недействительный восьмеричный символ), а «0xb10» - 2832 в десятичной системе. – Skizz

+0

К сожалению, это функция, которую я использовал только в C, я ошибочно предположил, что C++ унаследовал ее. –

+0

Это не C (возможно, расширение компилятора) – MSalters

0

80040E14 является двойной. При назначении на длинное значение становится равным нулю. 80040e14L - длинный двойной. выражение

constant == 80040e14L 

способствует постоянной в течение длительного дубля, так что вы имеете

0.0 == 80040e14 
Смежные вопросы