0x7fff是什么意思? C语言

时间:2020-07-09 14:49:24

标签: c memory printf ip-address

我已经创建了将内存地址打印到stdout的函数,但是它的功能与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 个答案:

答案 0 :(得分:1)

0x7fff58a2d2bb用十六进制(或基数16)格式表示的140,734,680,453,819,其中数字a代表10,b代表11,最多f代表15。

对于内存地址,基数优先于基数10或十六进制,因为16是2的幂,因此便于查看作为位掩码,而10则不是,因此就位掩码而言很难查看。 / p>

答案 1 :(得分:1)

0x7fff是什么意思?

丢失的“ 0x7fff”是错误代码ft_itoa_base()中丢失的正确十六进制地址的一部分。

给定one of the variables was int instead of uintmax_t,OP的原始ft_itoa_base()尚未完全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;

  ...