我如何签名扩展一个5位值

How can I sign-extend a 5-bit value?

本文关键字:一个 5位值 何签名 扩展      更新时间:2023-10-16

我有一个无符号整数(32位),其中我存储了一个n位的有符号数(2的补码,所以-16≤x <</p>

我如何使用两者的补数将其有效地转换为符号解释?

一个简短的例子来说明我的意思:

int numUnsigned = 15; // Store a 4-bit value 0b1111
int numSigned = ???; // Convert to 4-bit signed value using two's complement
// Now numSigned should be -1, since 0b1111 == -1

我整个上午都在摆弄这些零碎的东西,但好像就是弄不好。

如果我正确理解了你的问题,你只需要一个符号扩展,而不是2的互补(至少根据你在第二行代码中的评论)。

如果我是正确的,你可以做以下(让我们假设你有N个数字,0

unsigned msb_mask = 1 << (N-1); // setup a mask for most significant bit
numSigned = numUnsigned;
if ((numSigned & msb_mask) != 0) // check if the MSB is '1'
{
    numSigned |= ~(msb_mask-1); // extend the MSB
}
也许我误解了你的问题…如果是,那就忽略我的回答。

编辑

@harold建议:

numSigned = (numUnsigned^msb_mask)-msb_mask ;