2012-06-24 2 views
1

в моей программе Я сравниваю char с шестнадцатеричным int и получаю разные результаты для , работающего на КПК X86 PC и ARM, скомпилированных с помощью gg-gcc или native gcc на n900, либо way, Условие верно для ПК и не переходит на мобильный.Сравнение между указателем и целым числом в C на X86 по сравнению с ARM

int main(int argc, char *argv[]) 
{ 
     if (*argv[1] == 0xffffffcc) 
      puts("ok"); 

     return 0; 
} 
+0

На каком персонаже вы пытаетесь протестировать? Latin Capital Letter I С могилой или началом последовательности utf-8? –

+0

на обеих арках, которые я делаю: './a.out $ (printf" 0xcc "| xxd -r)' –

+0

Где в этом вопросе вы сравниваете указатель и целое число? – MikeMB

ответ

5

Это, вероятно, более разумно сравнивать с постоянной acutal character. Хотя целые рекламные акции все равно будут происходить с обоими операндами ==, по крайней мере, они будут происходить одинаково, и вы не будете зависеть от подписанности вашего char размера вашего int или unsigned int.

E.g.

if (*argv[1] == '\xcc') 

Я считаю, что он является общим для ARM компиляторы сделать char без знака означает, что, когда '\xcc' повышен до целого числа вы получаете значение 0xcc, не 0xffffffcc.

+0

: D смешно, это работает! –

+1

@ randomonkey: Почему это смешно? –

+0

Nevermind, я получал удовольствие от gcc ... –

5

В ARM-системах тип char обычно не имеет значения по умолчанию, а на x86 он обычно подписан. Оператор равенства == выполняет целые акции обоих операндов, поэтому различие в поведении, когда *argv[1] считается подписанным (расширение знака выполняется) или без знака (расширение знака не выполняется).

С gcc отметить, что вы можете изменить значение по умолчанию типа char с параметрами -fsigned-char и -funsigned-char.

Смежные вопросы