【问题标题】:How to tell if hex value is negative?如何判断十六进制值是否为负?
【发布时间】:2016-02-11 07:07:09
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 严格来说,你不能只看数字是负数还是正数;您还需要知道数字应该有多宽,以及它应该是签名还是未签名。
  • @IgnacioVazquez-Abrams 好的,假设我知道这个数字是 32 位签名的,我在我的问题中断言(粗体)是真的吗?
  • 它被简化了只是足以不准确。您需要查看位 n-1,其中 n 是位大小,最右边的位是位 0。
  • @IgnacioVazquez-Abrams 谢谢,我现在看得更清楚了。

标签: hex


【解决方案1】:

阅读二进制补码表示:https://en.wikipedia.org/wiki/Two%27s_complement

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

求反的方法是:

  1. 反转所有位
  2. 加1

这种表示(二进制补码)的另一个好处是,您只能得到一个表示为零的表示,如果您通过设置 MSB 或只是反转它们来标记带符号的数字,则不会出现这种情况。

【讨论】:

  • “虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。”
【解决方案2】:

据我了解,您始终需要查看最左边的数字来判断符号。如果是十六进制,则 0-7 为正数,8-f 为负数。或者,您可以将十六进制转换为二进制,如果最左边的数字有 1,则该数字为负数。

十六进制 二进制 符号
0-7 0000-0111 位置
8-F 1000-1111 否定

【讨论】:

  • 但是为什么十六进制%p = 0x7ffc9f7662f0,和%d一样打印=-1619631376,十六进制以7开头,却是负数
  • @Herdsman:因为%d 只打印int(在您的情况下为32 位),所以它只查看您传递的64 位arg 的低32 位。 0x9f7662f0 是负 int32_t。编译器应该警告您格式不匹配。 %p 用于指针;使用 %#llx 打印 unsigned long long 十六进制或 %lld 打印 long longen.cppreference.com/w/cpp/io/c/fprintf
  • 只要没有省略任何前导零,此答案就有效。例如持有0xFF 的16 位数字需要写为0x00FF 才能应用此规则。
【解决方案3】:

forum 中的答案看起来不错:

每个十六进制“数字”为 4 位。 d 在高阶位置 是 1101。所以你看它有一个高位,因此整个 数字是负数。

十六进制数始终为正数(除非您特别添加了减号 在它前面签名)。它可能被解释为负数 一旦您将其存储在特定的数据类型中。只有这样才最 有效位 (MSB) 很重要,但它是数字的 MSB “as 存储在该数据类型中”。在这方面,上面的答案只是 部分正确:仅在实际数据类型的上下文中(如 int 或 long) MSB 是否重要。

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-30
      • 2013-10-30
      • 1970-01-01
      • 2015-02-11
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      相关资源
      最近更新 更多