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.
Nie wiedziałem, że łańcuchy narzędzi ARM mają domyślny "unsigned char"! : o Dzięki za udostępnienie tego! –
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. –
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