如何解释十六进制数,例如0x0A?

6

在C++中,0x0A是一个16进制值,它代表的是换行符(\n)。当你看到这个值时,你应该将其解释为换行符而不是其他含义。

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;
}

8
顺便提一下,如果将那些魔法数字(760,0xa0)移动到一个地方定义的常量中,将会提高代码的可维护性。 - rsp
7个回答

28
正如已经提到的那样,0x0A等于十进制的10(十)。在许多系统上,这相当于LF(换行符)的ASCII代码,表示新的一行。但是在您的情况下,您使用的是需要传递一个ULONG参数的DisconnectClient方法。无论您是传递0xA还是10都没有关系。

在这种情况下,这个数字的意义是指客户端连接的接口。

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

理解十六进制

编辑:如果您想知道所有回答者为什么都知道十六进制0x0A等于十进制10,请继续阅读:

十六进制数是基于16的(hexa = 6,deca = 10)。我们现在习惯于使用十进制,但历史表明在二进制(基于2)数字变得普遍之前,甚至曾经使用过基于20(法国仍然有quatre-vingt),基于5(俄罗斯)和其他进制。基于16与基于10一样,但现在您不再有10个手指,而是有16个手指。

计算机只能以位为单位进行运算,四位(一个半字节)可以表示0-15。为了更方便地阅读和编写关于位的内容,使用了十六进制表示法。这增加了A-F到无处不在的数字0-9中,其中A等于10,B等于11,一直到F等于15。

在编程语言中,通常使用 x0x&h(根据编程语言而定)作为十六进制数的标识。与十进制数一样,前导零可以忽略不计,而末尾零则具有明显的含义。

将十六进制转换为十进制

那么,如何将十六进制转换为十进制呢?每个数字应该乘以 16 的幂,而不是十进制的10的幂。虽然有一个通用的简单公式可用于从任何 X 进制到任何 Y 进制的转换,但这里我们将其应用于从 16 进制到 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,在“运行”窗口或搜索框中键入“Calc”,然后单击“查看”>“科学型”。现在你可以输入十六进制数(按 F5),并在十进制(F6)、八进制(F7)和二进制(F8)之间切换。

关于数字及其基数方面还有很多要说的,但如果您需要更多信息,建议您查看数学论坛FAQ维基百科(更为通用)。想要在多种进制之间转换,请尝试这个在线X进制计算器

更新:添加了解析和转换十六进制数的部分,认为这是相关的;-)


5
我有时会想,这种类型的回答是否比带有指向指南的链接更好。难道 Stack Overflow 应该重写整个互联网吗? - abyx
1
有时候我也会想到这个问题(但是指南的链接已经在里面了)。有时候,初学者不知道如何搜索某些东西(例如,搜索“0xA”而不是“十六进制数”),最终只能提问。我认为,与其让他们去查阅众多的常见问题解答,不如总结感兴趣的部分,并指向更深入的阅读材料,这样做是值得的。 - Abel
1
好的,赞一个。我从来没有耐心总结一件已经被记录了很多次的事情 +1 :) - abyx

13

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


4

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

 #define REQUEST_FAILURE 0x02
 #define LOGIN_FAILURE 0x08

那么

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

3

这是一个十六进制数,表示为0A。在十进制中,它是10;在二进制中,它是00001010。


3

这是一个十六进制数字,0x0A 相当于十进制的 10。

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


1

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


0
那是十六进制格式的数字字面量。0x前缀表示十六进制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接