c++ 如何对5位值进行符号扩展?

wlp8pajw  于 2023-08-09  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个无符号整数(32位),其中存储了一个n位有符号数(2的补码,因此-16 ≤ x < 16,结果无符号值在0-15范围内)。
我如何使用二进制补码有效地将其转换为有符号的解释?
举个简单的例子来说明我的意思:

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

字符串
我整个上午都在摆弄这些小东西,但似乎总弄不好。

qojgxg4l

qojgxg4l1#

如果我对你的问题理解正确的话,你只需要一个符号扩展,而不是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 ;

相关问题