将 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 ;
假设我有一个整数(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 ;