gpt4 book ai didi

c - 如何正确输入双关语?

转载 作者:行者123 更新时间:2023-11-30 18:17:00 26 4
gpt4 key购买 nike

How can I determine if I'm overparenthesizing? 中扩展讨论的后续内容

我正在尝试用 C 语言模拟 Z80,其中可以组合多个 8 位寄存器来创建 16 位寄存器。

这是我尝试使用的逻辑:

struct {
uint8_t b;
uint8_t c;
uint16_t *bc;
} regs[1];
...
regs->bc = (uint16_t *)&(regs->b);

为什么这是不正确的,我怎样才能正确地做到这一点(如果需要,使用类型双关语)?

我需要多次执行此操作,最好是在同一结构内。

最佳答案

这是不正确的,因为 b 的类型为 uint8_t 并且指向 uint16_t 的指针不能用于访问此类变量。它可能没有正确对齐,它是 strict aliasing violation .

但是,自 (6.7.2.1/15) 起,您可以自由执行 (uint8_t *)&regs(struct reg_t*)&regs->b

A pointer to a structure object, suitably converted, points to its initial member and vice versa.

<小时/>

在进行与硬件相关的编程时,请确保永远不要使用有符号类型。这意味着将 intn_t 更改为 uintn_t

至于如何正确输入双关语,请使用 union :

typedef union
{
struct /* standard C anonymous struct */
{
uint8_t b;
uint8_t c;
};
uint16_t bc;
} reg_t;

然后您可以将其指定为指向 16 位硬件寄存器,如下所示:

volatile reg_t* reg = (volatile reg_t*)0x1234;

其中0x1234是硬件寄存器地址。

注意:该 union 依赖于字节序。 b 在大端系统上将访问 bc 的 MS 字节,但在小端系统上将访问 bc 的 LS 字节。

关于c - 如何正确输入双关语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55419777/

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