Потому что в UNIX / POSIX код завершения программы определяется как 8-разрядное значение без знака. Преобразование -1 в 8-битный без знака дает 255.
Изменить, чтобы добавить:
Более подробно: семейство системных вызовов wait * () в UNIX кодирует результат процесса в одно 32-битное целое число. 32 бита этого результата дополнительно разбиваются для предоставления такой информации, как то, было ли сброшено ядро процесса, выход из-за сигнала (и какой) и т. Д. Из этих 32 бит только 8 зарезервированы для кода выхода процесса и те интерпретируются как значение без знака.
Модель fork / exec / wait в UNIX / POSIX является одной из самых старых и наиболее глубоко встроенных функций; если бы вы разрабатывали новую операционную систему сегодня, вы могли бы сделать что-то другое (по крайней мере, использовать 64 бита :-)).
С другой стороны, практически полезно ли иметь> 255 кодов выхода? Я сомневаюсь в этом. Если бы вы действительно хотели что-то более мощное, я бы предложил переключиться на «строку выхода» вместо числового кода выхода с более широким диапазоном.