Я делал упражнение для университета, где мне приходилось возвращать значение с выходом, это значение на самом деле было чем-то подсчитанным. Это может быть выше 255 (к которому не удается обработать exit()), но учитель предложил использовать тестовые данные, где счетчик никогда не мог превышать это значение.
После всего этого мне нужно было обработать это значение счета, статус выхода, я получил это значение в основном процессе, используя waitpid(). К моему удивлению, если дочерний процесс вернулся 1, "реальным" значением в основном процессе было 256, 2 - 512 и так далее...
Мне нужно было напечатать это значение, поэтому я просто разделил его на 256, и это было сделано. Однако, если я использую макрос WEXITSTATUS(), я также получу это значение так, как хочу...
Я посмотрел исходный код C, и вот что я узнал:
#define __WEXITSTATUS(status) (((status) & 0xff00) >> 8)
Я понимаю, что происходит здесь, например, 512 в двоичном формате - 10 0000 0000, смещение 8 o справа даст 00 0000 0010, что равно 2 десятичным. То, что я не понимаю в этом макросе, - это то, что оператор и тот факт, что 0xff00 кажется случайным числом (это, вероятно, нет, откуда оно взялось?). Что это делает в точности, почему в макросе есть "& 0xff00"? Не будет ли это работать?
И реальный вопрос в этом вопросе - это то же самое, что и этот макрос в моем коде, делящийся на 256?