gpt4 book ai didi

c - 在 C 中访问数组的连续条目

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:55 26 4
gpt4 key购买 nike

假设我有这个:

uint8_t a[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

如果我:

printf("%lu", ((uint64_t*) a)[0]);

我会得到:

0x0102030405060708

如何使用非标准尺寸执行此操作?前任。 ((uint94_t) a)[0]。当然,没有 uint94_t,这就是我要问的。如何读取非标准位数(甚至字节数,它也适合我)?

注意:我不关心 printf 的特定字符串(因此它可以解析非标准数量的位/字节)但在数据类型中

最佳答案

"%ul" 表示 "%u"(unsigned int)后跟字母 "l"。也许您打算使用 "%lu"(unsigned long),但是对于 uint64_t,这两个都不正确。

正确的说明符在 inttypes.h 中找到,它是 "%"PRIu64

此外,这不会像您建议的那样打印 0x ,它会打印十进制表示形式。使用 "%"PRIx64 进行十六进制表示(也不会打印前导 0x)。


继续,您的代码导致 undefined behaviour .根据严格的别名规则,不允许使用 uint64_t 类型的表达式访问任何未写为 uint64_tint64_t 的变量> 首先。

您可以通过在 union 或其他方式中使用正确类型的变量来避免严格的别名规则,例如:

uint64_t x;
memcpy(&x, a, sizeof x);
printf("%" PRIu64 "\n", x);

您的编译器会对此进行优化,因此不必担心它效率低下或其他问题。

请注意,此输出是实现定义的,因为编译器可以选择各种方式来对 uint64_t 的位进行排序。两种常见的顺序是big-endianlittle-endian


您问题的另一部分是关于其他整数类型的。不幸的是,您受困于编译器提供的内容。它很可能不提供 uint94_t。你必须推出自己的代码才能实现你想要的。例如,您可以模拟 96 位大端字节序:

uint8_t a[12] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C};

uint64_t x = 0, y = 0;
mempcy((unsigned char *)&x + 4, a, 4);
memcpy(&y, a+4, 8);
printf("%" PRIx64 "%" PRIx64 "\n", x, y);

当然你可以一个字符一个字符地打印出来。

关于c - 在 C 中访问数组的连续条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34468954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com