C язык для отображения шестнадцатеричного символа из беззнакового указателя - PullRequest
0 голосов
/ 18 января 2020

// Как преобразовать число 12345 в беззнаковый символ * (почему '90') и как изменить код для отображения шестнадцатеричного значения (например, 0x80 ...)?

#include <stdio.h>
#include <stdlib.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer, size_t);
void show_bits(int);
void show_int(int);
void show_float(float);
void show_pointer(void *) ;
int  mask_LSbits(int);



void show_bytes(byte_pointer start, size_t len)
{
    size_t i;
    printf("address=%p",start);
    printf("\n");
    for (i = 0; I <len; i++)
    printf(" %x.2x", start[i]);  //modify here, how to change char to hex value
    printf("\n");
}
void show_int(int x) {
    printf("\nival = %d\n", x);
    show_bytes((byte_pointer) &x, sizeof(int));
} 
int main()
{
    int ival = 12345;
    float fval = (float) ival;
    int *pval = &ival;

    show_int(ival);

    return 0;

}

1 Ответ

3 голосов
/ 18 января 2020

Чтобы отобразить каждый из четырех компонентных байтов значения int, переданного (после приведения) к вашей функции show_bytes (при условии, что вы хотите получить их в формате 0x01), измените строку формата printf следующим образом :

printf(" 0x%02x", (unsigned int)start[i]);

0x печатается как есть; %02x форматирует действительное значение start[i] в шестнадцатеричном формате, всегда , используя ширину поля 2 и добавляя начальные нули, если необходимо.

Обратите внимание, что %x В формате ожидается, что unsigned int в качестве соответствующего аргумента, поэтому я добавил приведение.

Вывод, который я получаю, когда запускаю ваш код (с моей предложенной модификацией): 1021 *

ival = 12345
address = 000000CE690FFA30
0x39 0x30 0x00 0x00

Что соответствует целому числу со следующим (полным) шестнадцатеричным значением: 0x00003039 - равным 12345 в десятичном виде.

Также обратите внимание, что если вы добавите следующая строка:

printf("address=%p", pval);

в вашей функции main, вы увидите, что значение адреса pval не совпадает со значением, напечатанным в вашей функции show_bytes! Это потому, что вы передаете копию из ival в show_int, которая помещается (наиболее вероятно) в стек и, таким образом, фактически является переменной, отличной от оригинала (что pval указывает на).

...