问题描述
我最近获得了 HDF5 数据文件,其中包含在 julia 中读取时以十六进制格式显示的整数数组(使用 HDF5 包)。为了得到十进制格式的数字,我从一位同事那里学到了这个技巧:
julia> a = 0x000038f9
0x000038f9
julia> b = a + 0
14585
我想了解 Julia 在这里做什么。为什么/如何将十六进制格式数和十进制格式数相加的结果是十进制格式数。官方的 julia 文档似乎对这种行为没有太多说明。有没有更透明的方式来执行这种转换?谢谢。
解决方法
这不是关于十六进制数和十进制数,而是关于有符号数和无符号数。 Int
(以及 Int8
、BigInt
等类似类型)可以存储正数和负数,并以十进制打印,因为这是大多数人使用的数字系统。它们以二进制形式存储,就像几乎所有编程语言中的数字一样。
UInt
(和朋友)代表无符号数(它们必须大于 0)。它们以十六进制打印,因为使用它们的主要地方之一是按位运算(逻辑掩码、涉及重新解释 Float64
的黑魔法等)。因此,能够以十六进制查看它们很有用,因为这使人们更容易看到位的布局(因为十六进制的每个数字只有 4 位)。
在 Julia Int+UInt=UInt
中,但是 Int+UInt32=Int
(在 64 位系统上,因为 Int
是 64 位)。因此,当您将 UInt32
添加到 Int
时,julia 会进行数学运算(不需要基本转换,所有内部都是二进制的),并显示结果的 Int
。