Ответ 1
В большинстве случаев char
не имеет знака в ARM (для причин производительности) и подписан на других платформах.
iOS отличается от обычного соглашения для ARM, а char подписывается по умолчанию. (В частности, это отличается от Android, где код, скомпилированный в стандартах ndk по умолчанию, равен unsigned char.)
Это можно изменить в xcode, есть опция 'char' Type is unsigned
(по умолчанию она отключена). Если это будет изменено на "да", xcode пройдет -funsigned-char
до llvm. (Проверено на xcode 5.0.2)
Причина, по которой iOS отличается, упоминается в iOS ABI Function Call Guide: ARM64 Function Calling Conventions, в котором говорится просто:
В iOS, как и в других платформах Darwin, оба char и wchar_t подписанных типов.