如何从 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
类型。
我已经尝试并搜索了几个小时,但我就是不明白如何从无符号十六进制中获取负整数。我得到 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
类型。