Ваш код a[0] = (num>>24) & 0xFF;
берет 8 старших разрядов из num
и вставляет их в первый байт a
. На машинах с прямым порядком байтов первый байт содержит младшие биты. Это означает, что на машинах с прямым порядком байтов этот код берет 8 старших значащих битов и сохраняет их там, где идут младшие значащие биты, изменяя значение.
2130706432 - 0x7F000000 в шестнадцатеричном формате, а 127 - 0x0000007F.
Кроме того, x = *(int *)a;
приводит к неопределенному поведению. Рассмотрим оборудование, в котором чтение int с неправильно выровненного адреса вызывает ошибку шины. Если a
не будет правильно выровнено для int, то программа завершится сбоем.
Правильный подход к интерпретации байтов как int
был бы std::memcpy(&x, a, sizeof x);