将 n 位整数从无符号转换为有符号

Converting n bit integer from unsigned to signed

假设我有一个整数(32 位),它存储一个 n 位无符号数(n < 32)。 如何使用二进制补码将其有效地转换为带符号的解释?

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

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 0b111 == -1

我整个早上都在弄乱这些位,但似乎无法正确处理。

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

如果我是正确的,您可以执行以下操作(假设您有 N 个数字,0 < N < 32):

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 ;