Что означает 0x7fff? C язык - PullRequest
1 голос
/ 09 июля 2020

Я сделал функцию, которая выводит адрес памяти в stdout, но dosent работает так же, как printf ("% p", ...). Например, printf дает мне это: 0x7fff58a2d2bb, но моя функция выводит что-то вроде этого: 58a2d2bb. Я знаю, что означает 0x, но не могу понять, что означает 7fff. Может ли кто-нибудь объяснить мне, что означает эта часть и как я могу добавить ее в свой код:

char *ft_itoa_base(uintmax_t num, uintmax_t base){
int i;
uintmax_t val_cp;
uintmax_t rem;
char *str;

val_cp = num;
i = 1;
while((val_cp /= base) >= 1)
    i++;
str = ft_strnew(i); // Basically what it does (char*)malloc(sizeof(char) * (i + 1))
str[i] = '\0';
while(i-- > 0)
{
    rem = num % base;
    str[i] = (rem > 9)? (rem-10) + 'a' : rem + '0';
    num /= base;
}
return (str);}

char a = 'x';
void* p0 = &a;
uintmax_t i = (uintmax_t)p0;
ft_putstr(ft_itoa_base(i, 16));
ft_putchar('\n');
printf("PrintF: %p", p0);

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Что означает 0x7fff?

Отсутствующий «0x7fff» является частью правильного шестнадцатеричного адреса, потерянного в ошибочном коде ft_itoa_base().

Оригинал OP ft_itoa_base() не был полностью uintmax_t готов с учетом одна из переменных была int вместо uintmax_t .

Это привело к тому, что на выходе был напечатан усеченный адрес «58a2d2bb», а не правильный » 7fff58a2d2bb ".

Выложенная исправленная ft_itoa_base() имеет мелкие недостатки.

// char* ft_itoa_base(uintmax_t num, uintmax_t base) {
// No need for base to be so wide with uintmax_t
char* ft_itoa_base(uintmax_t num, int /* or unsigned */ base) {
  int i;
  uintmax_t val_cp;
  // uintmax_t rem;
  // No need for rem to be so wide with uintmax_t
  int /* or unsigned */ rem;
  char *str;

  ...
1 голос
/ 09 июля 2020

0x7fff58a2d2bb - это 140,734,680,453,819 в шестнадцатеричном (или по основанию 16) формате, где di git a представляет 10, b представляет 11, и до f представляет 15.

Основание 16 или шестнадцатеричный формат предпочтительнее, чем основание 10 для адресов памяти, потому что 16 - это степень двойки, что делает его удобным для просмотра как битовые маски, а 10 - нет, что затрудняет просмотр с точки зрения битовых масок.

...