将十六进制数正确转换为十进制数(也是负数)

converting a hexadecimal number correctly in a decimal number (also negatives)

如标题所示,我正在尝试将 0x320000dd 等十六进制数字转换为十进制数字。 我的代码仅适用于正数,但在涉及表示负十进制数的十六进制数时失败。这是我的代码的摘录:

         cin>>hex>> x;
         unsigned int number = x;
         int r = number & 0xffffff; 

我输入的是十六进制,电脑自动转换成整数。我想要做的是获取十六进制数的操作数,即最后 24 位。 你能帮我让我的代码为负值工作,比如 :0x32fffdc9 或 0x32ffffff 吗?非常感谢!

编辑:

我希望我的输出是: 0x32fffdc9 --> -567 或者 0x32ffffff --> -1

所以只是简单的十进制值,但上面的示例却给出了 16776649 和 16777215。

负整数通常存储在 2's complement 中,这意味着如果您的最高有效位 (MSB) 未设置,则该数字不是负数。这意味着就像您需要取消设置数字的 8-MSB 以将 32 位数字限制为 24 位正数一样,您需要 set 8 - 将您的号码的 MSB 限制为负数:

const int32_t r = 0x800000 & number ? 0xFF000000 | number : number & 0xFFFFFF;

vector<bool>bitset 可能值得您考虑,因为它们会将十六进制数阐明为要设置的位范围。