宏定义IMM/ADDR后判断失效求助:为何src1匹配IMM时parameter1不置true?
问题根源:宏定义的数值类型不匹配
你的问题核心是宏定义的IMM和ADDR使用了十进制数值,但代码中计算出的src1/src2是对应二进制位模式的十六进制数值,两者完全不相等,导致条件判断失效。
具体分析:
- 你定义的
#define IMM 10000是十进制的10000,转换成十六进制是0x2710,而你的代码中src1计算后是0x10(十进制16,对应二进制10000)——这两个数值天差地别,自然不会满足src1 == IMM的条件。 - 同理,
#define ADDR 10001是十进制10001(十六进制0x2711),但你实际期望匹配的是二进制10001(十进制17,十六进制0x11),同样不匹配。
另外补充一点:你开头的指令宏(比如#define add 000001)用了前导零,这在C/C中表示八进制数,000001对应十进制1(二进制000001),这个是符合你的预期的,但如果要更清晰地表示二进制位模式,建议用C11及以后支持的0b前缀(比如#define add 0b000001),避免八进制的歧义。
修正后的宏定义:
根据你期望的二进制位模式,应该把IMM和ADDR定义为对应数值的十六进制或二进制:
#define add 0b000001 // 或者 0x1 #define sub 0b000010 // 或者 0x2 #define jmp 0b000111 // 或者 0x7 #define IMM 0b10000 // 对应十进制16,十六进制0x10 #define ADDR 0b10001 // 对应十进制17,十六进制0x11
验证修正后的逻辑:
当src1是0x10(即二进制10000)时,src1 == IMM就会成立,parameter1会被正确设为true,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Flave
相关产品推荐
相关产品推荐

