Как эта функция печатает правильный HEX данного аргумента - PullRequest
0 голосов
/ 01 июля 2019

Во время моего чтения CS: APP 3-го издания я наткнулся на этот фрагмент кода, который знает, читая книгу больше, я мог бы получить правильное объяснение, но до сих пор я не совсем понимаю, как это возвращает правильный шестнадцатеричный код номер.

Я надеюсь, что кто-то здесь сможет дать мне подробное объяснение.

Что делает приведение указателя на адрес куска памяти?

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len)
{
    int i;
    for (i = 0; i < len; i++)
        printf(" %.2x", start[i]);
    printf("\n");
    }

void show_int(int x)
{
    show_bytes((byte_pointer) &x, sizeof(int));
}

И как, я имею в виду, как целое число сохраняется в памяти, потому что, когда я печатаю его как% d с примером 100 в качестве данного int. будет напечатано:

100 0 0 0

однако, когда я использую 1000, он напечатает:

232 3 0 0

Ответы [ 2 ]

1 голос
/ 01 июля 2019

&x дает указатель, где x запоминается, поскольку x является целым числом, он дает указатель на int (4 байта).

(byte_pointer) &x дает вместо этого указатель на символ (один байт), так что цикл for может проходить через каждый байт целого (start[i] указывает на i-й байт, а не на i-й целое).

0 голосов
/ 03 июля 2019

Печатает каждый элемент массива в виде двузначного шестнадцатеричного числа в формате %.2x. Вы также можете видеть его как %02x или %02X (используя заглавные буквы) и перед ним ставится пробел. Вы можете увидеть это напечатано также как:

while (len--) printf(" %02x", start++);

более компактным (и трудным для понимания новичкам)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...