2013-12-13 22 views

Odpowiedz

9

W większości przypadków char jest podpisany na ramię (dla performance reasons) i podpisany na innych platformach .

System iOS różni się od zwykłej konwencji dotyczącej ARM, a znak char jest domyślnie podpisany. (W szczególności różni się od Androida, where code compiled in the ndk defaults to unsigned char.)

Można to zmienić w kodzie Xcode, istnieje opcja 'char' Type is unsigned (która domyślnie jest wyłączona). Jeśli zmieni się na "tak", kod xcode przejdzie -funsigned-char do llvm. (Sprawdzone na Xcode 5.0.2)

Powodem iOS różni wspomina iOS ABI Function Call Guide: ARM64 Function Calling Conventions, który mówi po prostu:

w iOS, jak w przypadku innych platform Darwin, zarówno char i wchar_t są podpisane typy.

+0

Nie wiedziałem, że łańcuchy narzędzi ARM mają domyślny "unsigned char"! : o Dzięki za udostępnienie tego! –

+1

ARM EABI definiuje 'char' jako unsigned; dlatego robią to zwykłe toolchains. EABI robi wiele głupich rzeczy, ale jest to "standard" dla ARM, a mieszanka niekompatybilnych ABI z ich własnymi zepsutymi dziwactwami, które istniały przed pojawieniem się EABI, była prawdopodobnie gorsza niż EABI, z którym teraz utknęliśmy. –

+2

Głównym powodem, dla którego "char" jest unsigned w EABI jest typ unsigned 'char', który pozwala na szybszy kod na ARM, ponieważ ładowanie ARM i instrukcje przechowywania bajtów działają z niepodpisanymi wartościami (bez rozszerzenia znaku). – ouah

0

dlaczego po prostu tego nie wypróbowałeś?

char x,y; 

x=y=0x7F; 
x++; 
if(x>y) unsigned else signed... 
Powiązane problemy