Обработка массива символов как целого числа-изучите C сложным способом дополнительный кредит

в упражнении Зеда шоу "выучи C на собственном опыте" Упражнение 9 (http://c.learncodethehardway.org/book/ex9.html) есть дополнительный кредитный вопрос, который я нахожу интересным. Он определяет 4-символьный массив и просит читателя выяснить, как использовать массив в качестве 4-байтового целого числа.

в этот момент я знаю достаточно, чтобы быть опасным, и я думал, что ответ будет примерно таким:

#include <stdio.h>

int main(int argc, char *argv[])
{
    char name[4] = {'A'};

    int *name_int;
    name_int = &name;
    printf("%d", *name_int);

    return 0;
}

мои мысли о том, что если я создал указатель int с значение адреса массива типа int использовать байт данных на этот адрес, затем 3 байта данных. В моем ограниченном понимании у меня сложилось впечатление, что и int, и массив будут использовать память одинаково: начиная с произвольного адреса памяти, чем используя следующий адрес в последовательности, и так далее.

однако результат этого не то, что я ожидал: я получаю значение ascii 'A'. Что, по-моему, указывает на то, что мое решение неверно, мое понимание того, как обрабатывается память, неверно или и то, и другое.

как этот маленький взлом может быть выполнен, и где это я иду не так? Я надеюсь уйти от этого с лучшим пониманием того, как работают указатели и ссылки, и как хранится и используется память.

спасибо!

1 ответов


вы сталкиваетесь с представлением чисел little-endian vs big-endian.

давайте рассмотрим значения 4-btyes, используемые для представления 4-байтового целого числа.

+----+----+----+----+
| N1 | N2 | N3 | N4 |
+----+----+----+----+

в представлении big-endian эти 4 байта представляют:

N1*2^24 + N2*2^16 + N3*2^8 + N4

в представлении little-endian эти 4 байта представляют:

N1 + N2*2^8 + N3*2^16 + N4*2^24

в вашем случае.

N1 = 'A' (65 decimal)
N2 = 0
N3 = 0
N4 = 0

так как значение integer, которое вы получаете, является 65, у вас есть немного представление прямой. Если вы хотите рассматривать эти числа как представление big-endian, вы можете использовать следующее:

#include <stdio.h>

int main(int argc, char *argv[])
{
   int i;
   char nameString[4] = {'A'};
   int name = 0;

   for ( i = 0; i < 4; ++i )
   {
      name = (name << 8) + nameString[i];
   }

   printf("%d\n", name);
   printf("%X\n", name);

   return 0;
}

вывод, который я получаю с вышеуказанным кодом:

1090519040
41000000