gpt4 book ai didi

c - 符号扩展 C 中的九位数字

转载 作者:太空狗 更新时间:2023-10-29 16:28:19 25 4
gpt4 key购买 nike

我有一个空头,instr ,看起来像这样:

1110xxx111111111

我需要取出位 0-9,我用 (instr & 0x1FF) 来做.然后将该数量存储在一个新的空头中。问题是,当发生这种情况时,它会变成 0x0000000111111111 , 不是 0x1111111111111111就像我想要的那样。我怎样才能解决这个问题?谢谢!

编辑

代码如下:

short instr = state->mem[state->pc];
unsigned int reg = instr >> 9 & 7; // 0b111
state->regs[reg] = state->pc + (instr & 0x1FF);

这是一个以汇编形式读取的模拟器。 state是机器,regs[]是寄存器和pcmem[]中当前指令的地址.

如果最后九位代表一个正数,这很好,但如果它们代表 -1,它存储为全 1,我的代码将其解释为正值。

最佳答案

假设一个 short 是 16 位:

您可以手动完成:(instr & 0x1FF) | ((instr & 0x100) ? 0xFE00 : 0) .这将测试符号位(您保留的最高位,0x100),如果设置了符号位,则设置其上方的所有位。您可以通过将掩码调整为 0x1F 将其扩展到 5 位, 0x100xFFE0 , 作为低 5 位,第 5 位本身和所有的位 5-16 分别。

或者您可以找一些借口将这些位分配给带符号的 short 的上部并将它们向下移动(在此过程中获得符号扩展):short x = (instr & 0x1FF) << 7; x >>= 7;后者实际上可能最终在组装中更加直接,并且不会涉及分支。如果instrsigned 这可以在单个表达式中完成:(instr & 0x1FF) << 7 >> 7 .由于这已经删除了高位,因此它简化为 instr << 7 >> 7 .对于 5 位 (16-5),将 7 替换为 11。

关于c - 符号扩展 C 中的九位数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5814072/

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