为什么有人会在 C 中用 16 位掩码按位与 8 位值?

Why would someone bitwise AND an 8-bit value with a 16-bit mask in C?

我正在尝试在 C# 中复制 Javidx9 的 NES/MOS6502 CPU 代码作为学术练习,但我无法理解零页寻址模式实施背后的逻辑。具体来说,我正在看这个 code:

// Address Mode: Zero Page
// To save program bytes, zero page addressing allows you to absolutely address
// a location in first 0xFF bytes of address range. Clearly this only requires
// one byte instead of the usual two.
uint8_t olc6502::ZP0()
{
    addr_abs = read(pc);    
    pc++;
    addr_abs &= 0x00FF;
    return 0;
}

我很难理解为什么 addr_abs &= 0x00FF; 在那里,uint16_t addr_abs 是 16 位但是 uint8_t read(uint16_t a); returns 无论如何,一个 8 位值,所以高 8 位(MOS6502 是小端)默认为 00?我是不是漏掉了 C compiler/x86 ISA 的工作原理?

你说得对 addr_abs &= 0x00ff 不需要。

uint16_t x = n 其中 n 是一个无符号的 8 位数字(这里就是这种情况)。 x 会清除它的高 8 位。正如@tadman 所述,之前可能使用了一种不同的方法将值存储到 addr_abs 中,但没有清除高 8 位。