此函数如何打印给定参数的正确十六进制

时间:2019-07-01 14:21:50

标签: c memory

在我阅读CS:APP 3rd Edition的过程中,我偶然发现了这段代码,谁知道我在阅读本书的同时可能会得到正确的解释,但是直到现在我还不太明白这是如何检索正确的十六进制的数字。

我希望这里有人能够给我详尽的解释。

投射指向内存地址的指针有什么作用?

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 个答案:

答案 0 :(得分:1)

&x给出了x所存储的指针,因为x是一个int,所以它给出了一个指向int的指针(4个字节)。

(byte_pointer) &x给出一个指向char(单个字节)的指针,以便for循环可以遍历int的每个字节(start[i]指向第i个字节,而不是第一个字节。第i个int)。

答案 1 :(得分:0)

将每个数组元素打印为两位十六进制数字,格式为%.2x。您还可以看到它也写成%02x%02X(使用大写字母),并以空格开头。您也可以将其打印为:

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

以更紧凑的方式(新手很难理解)