【问题标题】:how to get a signed int from an unsigned hex in C++?如何从 C++ 中的无符号十六进制获取有符号整数?
【发布时间】:2017-04-19 03:11:30
【问题描述】:

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

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

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

期待一些建议。

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

【问题讨论】:

  • 你得到0xfffef1作为字符串输入,或者你的意思是什么?
  • 不作为 int sry。
  • 搜索“二补”
  • 谢谢我试过,但我不知道如何在 C++ 中做到这一点。我只能用手做
  • 没有“无符号十六进制”之类的东西。一个数字就是一个数字。

标签: c++ hex unsigned-integer


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    #include <iostream>
    
    int main () {
    
        int a = 0xfffef1;
        a |= 0xff << 24;
        std::cout << a << std::endl;
    }
    

    请参阅Live Demo

    【讨论】:

    • 哦,非常感谢,太好了。但是我怎样才能让它只在它是负数时才这样做呢?
    • @GregorHohl 检查 24 位值的最高有效位是否为 1
    • if((a
    • 或者我怎样才能只检查一位的值?
    • @GregorHohl 更多类似:if((a &amp; 0x800000) &gt; 0)
    猜你喜欢
    • 2010-09-18
    • 2017-02-17
    • 2013-09-06
    • 2012-10-25
    • 2011-06-15
    • 1970-01-01
    • 2012-04-08
    • 2010-11-26
    • 2011-06-11
    相关资源
    最近更新 更多