我如何正确键入双关语?

问题描述 投票:-1回答:4

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);

为什么这是不正确的,以及我如何正确地做到这一点(如果需要,可以使用类型校正)?

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

[如何确定我是否过于括号化之后的后续讨论?我正在尝试在C中模拟Z80,其中可以将几个8位寄存器组合在一起以创建16位寄存器。 ...

c emulation type-punning z80
4个回答
7
投票

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


3
投票

要模拟可作为两个8位寄存器或一个16位寄存器访问的硬件寄存器,可以使用:


3
投票

正确的方法是通过C中的匿名联合,如其他答案所示。但是,当您要处理字节时,可以在严格的别名规则中使用特殊的字符处理:无论使用哪种类型,使用char指针访问其表示形式的字节始终是合法的。所以这符合C


-2
投票

正确打入C语言的正确方法(或对此几乎做任何事情)是使用一种配置为适合自己预期目的的实现。该标准特意允许旨在用于各种目的的实现方式以使其不适用于其他目的的方式运行。这组作者认为,这绝不是要建议那些行为不是标准强制要求的程序(而是将在其预期的实现中定义)的程序应该被视为“中断”。作者寻求支持客户需求的编译器将认识到简单的类型转换构造,无论标准是否要求他们这样做,而作者鄙视其客户需求的优化器也不应该可靠地处理任何复杂的事情。

© www.soinside.com 2019 - 2024. All rights reserved.