【问题标题】:How to interpret hexadecimal numbers like 0x0A?如何解释像 0x0A 这样的十六进制数字?
【发布时间】:2010-12-16 14:25:06
【问题描述】:

0x0A 在 C++ 中是什么意思,我应该如何解释或读取这样的十六进制值?

if (version < 760 || version > 760){
    disconnectClient(0x0A, STRING_CLIENT_VERSION);
}

uint32_t accnumber = msg.GetU32();
std::string password = msg.GetString();

if(!accnumber){
    disconnectClient(0x0A, "You must enter your account number.");
    return false;
}

【问题讨论】:

  • 顺便说一句,如果将这些幻数 (760, 0xa0) 移动到在一个地方定义的常量中,它将提高该代码的可维护性。

标签: c++ syntax hex


【解决方案1】:

如前所述,0x0A 等于十进制 10(十)。这等于 LF(换行)的 ASCII 码,在许多系统上都是换行符。但在您的情况下,您使用DisconnectClient,它采用ULONG。无论您是通过0xA 还是仅仅通过10 都无关紧要。

这个数字的含义,在这种情况下,是客户端正在连接的接口

编辑:再次查看您的代码,您的 disconnectClient 函数与 MSDN 上的函数不同。如果它是用户定义的方法,找出0x0A 的含义需要检查该方法本身或其文档(尽管它可能只是“真实”DisconnectClient 的存根,并且只需传递参数)。

理解十六进制

编辑:如果您想知道这里的所有回答者似乎都知道十六进制 0x0A 等于十进制 10,请继续阅读:

十六进制数以 16 为底(hexa = 6, deca = 10)。我们现在习惯于以 10 为底,但历史表明,甚至在二进制(以 2 为底)数字变得普遍之前,以 20 为底(法国仍然有 quatre-vingt)、以 5 为底(俄罗斯)和其他数字已经被使用用于计算机。 Base-16 与 base-10 一样,但现在你没有 10 个手指,而是 16 个。

计算机只能以位为单位思考,四个位(一个半字节)可以使数字 0-15。为了更容易读写位,使用了十六进制表示法。这会将 A-F 添加到普遍存在的数字 0-9,其中 A 等于 10,B 等于 11,直到 F 等于 15。

在编程语言中,通常以x0x&amp;h(取决于语言)开头的数字表示十六进制数。与十进制数一样,前导零可以被忽略。尾随零有其明显的含义。

十六进制转十进制

那么,如何将十六进制数转换为十进制数?每个数字都应该乘以 16 的幂,而不是十进制的 10 的幂。有一个简单的通用公式可以从任何 base-X 到任何 base-Y,但这里适用于从 base-16 到 base-10。

  1. 取每个十六进制数字,写下它的十进制版本
  2. 将每个数字乘以 16^pos,其中 pos == 十六进制数中的位置,最右边的位置为零
  3. 添加结果

数字0x8B20变成:

8 * 16^3 = 8 * 4096 = 32768 B * 16^2 = 11 * 256 = 2816 2 * 16^1 = 2 * 16 = 32 0 * 16^0 = 0 * 1 = 0 -------- + 35616

手工操作相当乏味,但我希望你能理解。如果您有 Windows,请在运行窗口或搜索框(Vista、W7)中键入 Calc,然后单击查看 > 科学。现在您可以键入十六进制数字(按 F5)并在十进制 (F6)、八进制 (F7) 和二进制 (F8) 之间切换。

关于数字及其基数还有很多要说的,但如果您需要更多,我建议您查看math forum faqWikipedia (more general)。要在多个碱基之间进行转换,请尝试this online base-X calculator

更新:添加了关于理解和转换十六进制数的部分,认为它可能适用;-)

【讨论】:

  • 我有时想知道这种类型的答案是否比带有指南链接的答案更好。堆栈溢出是否应该重写整个互联网?
  • 大声笑,我有时也想知道(但指南的链接在)。有时,初学者不知道如何搜索某些东西(即搜索“0xA”而不是“十六进制数字”)并最终询问。与其将它们指向众多常见问题解答,我认为值得总结感兴趣的部分,并指出它们以进一步阅读。
  • 好吧,赞。我永远不会有耐心总结在 +1 之前已经记录了很多次的事情 :)
【解决方案2】:

这是一个十六进制格式的数字文字。 0x 前缀表示十六进制。

【讨论】:

    【解决方案3】:

    这是十六进制的数字 10。通常代表各种代码的数字以十六进制给出,以便您可以“看到位”。例如,相同的十六进制数字,但添加了 16 位,将是 0x1A。加上 256 位,它将是 0x11A。在十进制中,这将是 256+16+10=282,更难看出哪些位处于打开状态。

    【讨论】:

      【解决方案4】:

      我怀疑它是作为正在使用的协议的一部分发送回客户端的状态代码。通常,设置的每个位都将代表一些标志。在这种情况下,设置的标志是对应于(低)2 和 3 位(从零开始计数)的标志。处理此问题的更好方法是将标志定义为宏,然后简单地使用它们(ORing 以获取组合)。

       #define REQUEST_FAILURE 0x02
       #define LOGIN_FAILURE 0x08
      

      然后

       disconnectClient( REQUEST_FAILURE | LOGIN_FAILURE,
                         "You must enter your account number." );
      

      【讨论】:

        【解决方案5】:

        即十六进制数,0x0A与十进制数10相同。

        在这种情况下,它只是一些编号。

        【讨论】:

          【解决方案6】:

          0x 是十六进制表示法的前缀。 0x0A为十六进制数A,十进制为10。

          【讨论】:

            【解决方案7】:

            它是十六进制数 0A。十进制为10;二进制,00001010。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-11-11
              • 1970-01-01
              • 2016-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多