Ответы, данные (пока), сосредоточены на том, почему BOOL не является int. Этот ответ довольно ясен: char меньше, чем int, и когда Objective-C был разработан еще в 80-х, сбрасывание нескольких байтов всегда было хорошо.
Но, похоже, ваш вопрос также звучит так: «Почему BOOL подписан, а не подписан?» Для этого мы можем посмотреть, где BOOL typedef'ed, в /usr/include/objc/objc.h
:
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
Итак, есть ответ: разработчики Objective-C не хотели вводить определение BOOL в char, потому что в некоторых системах под некоторыми компиляторами (и помните, что Objective-C предшествовал ANSI C, поэтому компиляторы C отличались), char был подписан, а под некоторыми, без подписи. Проектировщики хотели, чтобы @encode(BOOL)
возвращало согласованное значение для разных платформ, поэтому они включили подпись в typedef.
Но все же возникает вопрос: почему подписано, а не подписано? У меня нет однозначного ответа на это; Я предполагаю, что причина в том, что они должны были выбрать один или другой, и решили пойти с подписью. Если бы мне потребовалось дальнейшее предположение, я бы сказал, что это потому, что целые числа подписаны по умолчанию (то есть, если они не содержат спецификатор подписи).