如何判断十六进制值是否为负数?

时间:2015-11-10 11:55:37

标签: hex

我刚学会了如何读取十六进制值。到现在为止,我只是把它们看作正数。我听说你也可以写负十六进制值。

我的问题是我无法判断某个值是负数还是正数。 我在这里和那里找到了一些解释,但如果我尝试使用在线的十六进制到十进制转换器来验证它们,它们总会给我不同的结果。

我找到的来源:
https://stackoverflow.com/a/5827491/5016201
https://coderanch.com/t/246080/java-programmer-OCPJP/certification/Negative-Hexadecimal-number

如果我理解正确,则意味着:
如果用其所有位写入的十六进制值具有> 7作为其第一个十六进制数字,它是负数。
所有' F'在开头或第一个数字只表示该值为负,不计算。

例如,如果十六进制值以32位写入:
FFFFF63C =>否定(-2500?)
844fc0bb =>否定(-196099909?)
F44fc0bb =>否定(-196099909?)
FFFFFFFF =>负(-1?)
7FFFFFFF =>积极的

我说错了吗?如果没有,你能告诉我我没有做对吗?

4 个答案:

答案 0 :(得分:13)

阅读两个补语表示:https://en.wikipedia.org/wiki/Two%27s_complement

我认为理解负数(通常)如何处理的最简单方法是记下一个小的二进制数,然后弄清楚如何减1。当你达到0并再次应用这种方法时 - 你会发现你突然得到所有的1。这就是" -1"是(通常)表示:所有的二进制或所有f的十六进制。通常,如果使用带符号的数字,则它们由第一个(最重要的)位表示为1。也就是说,如果使用多个四位的位数,那么如果第一个十六进制数字是8,9,A,B,C,D,E或F,则数字为负。

做出否定的方法是:

  1. 反转所有位
  2. 添加1
  3. 这种表示的另一个好处(两个补码)是你只得到一个零表示,如果你通过设置MSB标记有符号数或者只是反转它们就不会出现这种情况。

答案 1 :(得分:6)

根据我的理解,你总是需要查看最左边的数字来告诉标志。如果是十六进制,则0-7的任何内容都是正数,8-f是负数。或者,您可以从十六进制转换为二进制,如果最左边的数字为1,则数字为负数。

HEX< - > BINARY< - > SIGN
0-7< - > 0000-0111< - > POS
8-F - 。 1000-1111< - > NEG

答案 2 :(得分:3)

forum中的答案看起来不错:

  

每个十六进制“数字”是4位。 d处于高位   是1101.所以你看到它有一个高位,因此整个   数字是负数。

  

十六进制数总是正数(除非你专门设一个减号   签到它前面)。它可能被解释为负数   一旦将其存储在特定数据类型中。只有这样才能做到最好   有效位(MSB)很重要,但它是数字的MSB“as   存储在该数据类型中“。在这方面,上述答案仅为   部分正确:仅在实际数据类型的上下文中(如   int或long)MSB是否重要。

     

如果在int中存储“0xdcafe”,它的表示形式就是   “0000 0000 0000 1101 1100 1010 1111 1110” - MSB为0.而   “0xdeadcafe”的表示是“1101 1110 1010 1101 1100 1010 1111   1110“ - MSB为1。

答案 3 :(得分:0)

您可以通过检查十六进制整数的最高有效(最高)数字来判断其为正还是负。如果数字≥8,则数字为负;否则,数字为负。如果数字≤7,则为正数。例如,十六进制的8A20为负,而7FD9为正