我们正在编写一个模拟器,需要进行右移符号扩展。被模拟的系统使用二进制补码表示数字。
我了解到,在C语言中,带符号整数的
这意味着我需要使用位操作来重现算术右移,而且如果可能的话,我想避免不必要的分支。
编辑:
响应评论:
“OP需要定义当x和y都为正数时结果是什么。”
我基本上想要复制SAR x86指令的行为。在那里,负数使用二进制补码表示。对于负数,右移应该基本上意味着除以2。
这意味着对于以1开头的位模式。例如:1xxxxxxx,右移应该得到11xxxxxx。对于以0开头的位模式,例如:0xxxxxxx,右移应该得到00xxxxxx。所以最高有效位是“粘性的”。位移超过字长没有定义。
我了解到,在C语言中,带符号整数的
>>
运算符是实现定义的。因此我不能依赖于这个事实,以保证在所有平台上都会得到正确的位模式。这意味着我需要使用位操作来重现算术右移,而且如果可能的话,我想避免不必要的分支。
编辑:
响应评论:
“OP需要定义当x和y都为正数时结果是什么。”
我基本上想要复制SAR x86指令的行为。在那里,负数使用二进制补码表示。对于负数,右移应该基本上意味着除以2。
这意味着对于以1开头的位模式。例如:1xxxxxxx,右移应该得到11xxxxxx。对于以0开头的位模式,例如:0xxxxxxx,右移应该得到00xxxxxx。所以最高有效位是“粘性的”。位移超过字长没有定义。
x
中的符号位被设置为x >> y
时,“正确”的结果是什么。 - chux - Reinstate Monica