【发布时间】:2021-07-09 10:21:05
【问题描述】:
我目前正在处理一项需要打印变量地址的任务。使用 printf %p 很容易,但我只能使用 unistd 中的 write。
我尝试将指针转换为无符号整数和 uintptr_t,然后将其转换为十六进制数。使用 uintptr_t 它可以工作,但使用无符号整数它只打印地址的一半。也许有人可以解释一下为什么会这样?
我还看到了一些使用“>>”和“>”的解决方案,那就太好了,因为我不确定是否允许我使用 uintptr_t。
这是我用来将其转换为 unsigned int / unitptr_t / unsigned long long 的代码(我知道 ft_rec_hex 缺少前导 0):
void ft_rec_hex(unsigned long long nbr)
{
char tmp;
if (nbr != 0)
{
ft_rec_hex(nbr / 16);
if (nbr % 16 < 10)
tmp = nbr % 16 + '0';
else
tmp = (nbr % 16) - 10 + 'a';
write(1, &tmp, 1);
}
}
int main(void)
{
char c = 'd';
unsigned long long ui = (unsigned long long)&c;
ft_rec_hex(ui);
}
【问题讨论】:
-
因为你使用的“无符号整数”只有
uintptr_t的一半大小? (uintptr_t是一个无符号整数,所以看起来很废话) -
jsiller,“不确定我是否可以使用 uintptr_t。” -->
uintptr_t是可选类型。替代方案:使用最广泛的可用:uintmax_t, unsigned long long, ... -
"我尝试将指针转换为无符号整数和 uintptr_t,然后将其转换为十六进制数。" --> 最好发布该代码。
-
unsigned long long 的输出与 unsigned int 相同
-
没关系,我 2 天前试过这个,显然做错了,因为长时间工作