如何从 C++ 中的无符号十六进制获取有符号整数?

how to get a signed int from an unsigned hex in C++?

我已经尝试并搜索了几个小时,但我就是不明白如何从无符号十六进制中获取负整数。我得到 24 位十六进制数并想要有符号整数。

(澄清一下:我得到一个 24 位的十六进制数字。然后我将它作为一个整数读取,然后我想将它作为一个带符号的整数给出。)

例如

0xfffef1 应该是 -271 但我不知道如何到达那里。

期待一些建议。

我试过反转 24 位,然后像处理二进制一样添加一个,但我也不知道该怎么做。

用最高有效字节完成 2 补码应该可以正常工作:

#include <iostream>

int main () {

    int a = 0xfffef1;
    a |= 0xff << 24;
    std::cout << a << std::endl;
}

参见Live Demo

一个问题是高位是二进制补码表示,需要置位表示负;这取决于整数大小。

例如,对于 8 位整数,负值将是:
1000 1101

16位整数中相同的数不为负数:
0000 0000 1000 1101

因此您需要执行 符号扩展 以便用 1 填充前导 0:
1111 1111 1000 1101
^--扩展符号位。

我的建议是将十六进制值读入适当大小的整数,例如 int8_t 或 int16_t,然后转换为 int 类型。