Я скомпилировал и выполнил этот код на macOS в Xcode 10.0 (clang: Apple LLVM версии 10.0.0), и он возвращает 255. С другой стороны, в Windows в Visual Studio Community Edition v.15.8.6 он возвращает -1. Может кто-нибудь объяснить такое поведение на macOS? Код указан ниже.
int main() {
return -1;
}





В системах POSIX (таких как macOS или Linux) код возврата из процесса состоит из нескольких частей, а код возврата из main сохраняется только в младших восьми битах значения int.
Большинство современных систем используют два дополнения для представления отрицательных целых чисел, и при этом знаковое значение -1 становится 255, потому что все биты в байте будут установлены.
Из-за этого не рекомендуется возвращать отрицательные числа из main (или вызывать exit с отрицательным числом). Вместо этого используйте только маленькие неотрицательные числа, где 0 считается успешным. Или, конечно, использовать стандартные макросы EXIT_SUCCESS и EXIT_FAILURE.
Windows, не являясь системой POSIX, на самом деле не заботится об этом и использует все значение int для возвращаемого значения.
Некоторые ОС (POSIX) имеют предел диапазона кода возврата от 0 до 255 (фактически uint8_t). -1, преобразованный в uint8_t, равен 255.
В зависимости от ОС код ошибки, возвращаемый родительскому процессу, представляет собой char, int8_t, uint8_t или, возможно, что-то еще. Судя по числам, которые вы получаете, MacOS, похоже, имеет uint8_t, поэтому -1 отображается как 255, в то время как Windows имеет int8_t или больше, поэтому отображается -1.
Это не имеет ничего общего с вашей программой, а связано с типом данных, используемым в ОС для сообщения кодов возврата процессов. Здесь ничего нельзя изменить.
Примечание: вы не должны использовать -1/255 в качестве кода выхода, так как он уже используется для сигнализации об ошибке загрузки вашей программы в системе unix / linux. Лучше использовать 1,2,3, ... в качестве кодов ошибок, чтобы избежать конфликтов.