Ответ 1
Отмените порядок индексов a [], например. a [0] → a [3]
Я думаю, что у вас есть противоположность в обратном направлении.
Попробуйте следующее:
a[3] = (num>>24) & 0xFF;
a[2] = (num>>16) & 0xFF;
a[1] = (num>>8) & 0xFF;
a[0] = num & 0xFF;
Сначала я конвертирую число int32 в массив char [4], а затем преобразую массив обратно в int32 by (int *), но число не совпадает с предыдущим:
unsigned int num = 2130706432;
unsigned int x;
unsigned char a[4];
a[0] = (num>>24) & 0xFF;
a[1] = (num>>16) & 0xFF;
a[2] = (num>>8) & 0xFF;
a[3] = num & 0xFF;
x = *(int *)a;
printf("%d\n", x);
выход равен 127. И если я устанавливаю num = 127, выход равен 2130706432. У кого-нибудь есть идеи?
Отмените порядок индексов a [], например. a [0] → a [3]
Я думаю, что у вас есть противоположность в обратном направлении.
Попробуйте следующее:
a[3] = (num>>24) & 0xFF;
a[2] = (num>>16) & 0xFF;
a[1] = (num>>8) & 0xFF;
a[0] = num & 0xFF;
Чтобы узнать, что произойдет, используйте
printf("%x\n", ...);
чтобы печатать как входные, так и выходные номера.
Не зависит от конца:
x = (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3];
Ваш код a[0] = (num>>24) & 0xFF;
принимает самые важные 8 бит из num
и вставляет их в первый байт a
. На маленьких конечных машинах первый байт содержит наименьшие значащие биты. Это означает, что на маленьких конечных машинах этот код принимает самые важные 8 бит и сохраняет их в том месте, где идут младшие значащие биты, изменяя значение.
2130706432 равен 0x7F000000 в шестнадцатеричном виде, а 127 - 0x0000007F.
Кроме того, x = *(int *)a;
приводит к поведению undefined. Рассмотрим аппаратное обеспечение, где чтение int из неправильно выровненного адреса вызывает ошибку шины. Если a
не соответствует правильному выравниванию для int, программа сработает.
Правильный подход к интерпретации байтов как int
будет std::memcpy(&x, a, sizeof x);
Эта строка никогда не будет корректно работать на машине little-endian:
x = *(int *)a;
Вам нужно распаковать данные, прежде чем распечатать значение.