Julia语言程序设计
上QQ阅读APP看书,第一时间看更新

3.1.1 表达方式

在开发中,经常会以字面值(Literal)的方式提供数据(即直接将具体数字写在代码中),例如:


julia> x1 = 20            # 20即为字面值
20

其中定义了x1变量,并将字面值20赋值给它。在赋值语句执行后,REPL打印了执行的结果,即显示x1的结果值为20。

但在实践中,不仅会有最为常用的十进制,还会有十六进制、八进制等。尤其是在整数表达中,多种数制的表达与转换是经常遇到的问题,甚至有时候需要直接使用二进制方式。

在Julia中以不同的数制输入字面值是非常方便的,只需在数值的前面设置对应的前缀即可:0x表示十六进制数,0b表示二进制数,而0o则表示八进制数(第二个圈不是零而是字母O的小写)。需要注意的是,这些前缀中的字母标识x、b及o只能是小写,不能是大写。

下面我们分别给出数值20的各种进制表达方法,如下所示:


julia> 0x14                              # 十六进制
0x14

julia> 0b10100                                                                                                                          # 二进制
0x14

julia> 0o24                                                                                                                          # 八进制
0x14

这三种表达方式在REPL展示时都被显示为十六进制,可见它们确实表达了同样的值。但它们的类型也是一样的吗?与前面的十进制20又有什么不同?

事实上,我们可以使用typeof()函数在任何时候查看某个值或变量等任意对象的类型,例如:


julia> typeof(20)
Int64

julia> typeof(0x14)
UInt8

julia> typeof(0b10100)
UInt8

julia> typeof(0o24)
UInt8

我们会发现,这四个值虽然都是整数20,但类型却不都是一样的。

整数类型的确定需要考虑两个方面的问题,一是有符号还是无符号,二是位数。在Julia自动确定字面值类型的过程中,会将十进制的字面值确定为有符号整型,而将其他进制的数均处理为无符号整型;而在位数选择方面,十进制字面值会默认与操作系统的位数保持一致,除非字面值过大,需要选择更大的位数,对于非十进制的其他数制字面值会依据值的大小选择恰当的位数。

仍以数值20的四种进制表达方式为例,0x14、0b10100及0o24均被确定为无符号整型,而十进制被确定为有符号整型;虽然大小都是20,但十进制选择了64位(笔者运行示例的系统为64位,后文未说明均为64位操作系统),其他的进制则仅选择8位。我们可以借助内置的bitstring()查看这些值在内部的二进制结构:


julia> bitstring(20)
"0000000000000000000000000000000000000000000000000000000000010100"               # 64位

julia> bitstring(0x14)
"00010100"                                         # 8位

julia> bitstring(0b10100)
"00010100"                                         # 8位

julia> bitstring(0o24)
"00010100"                                         # 8位

可见十进制的字面值20在存储结构中确实采用了64位,而其他的三个采用了8位。

我们再看看一个比20大得多的例子:


julia> bign = 300000000000000000000000;

julia> typeof(bign)
Int128

上例将变量bign绑定到了一个非常大的整数,因为是十进制,所以确定为有符号类型,但却超出了Int64所能表达的范围,所以最终将类型放大到128位有符号整型。

对于其他进制这种情况也类似,例如:


julia> typeof(0x14F)                                         # 对应十进制数335
UInt16

julia> typeof(0x14FFF)                                          # 对应十进制数86015
UInt32

julia> typeof(0x14FFFFFFF)                                         # 对应十进制数5637144575
UInt64

julia> typeof(0x14FFFFFFFFFFFFFFF)                # 对应十进制数24211351596743786495
UInt128

可见数值越大,Julia选择类型的位数越高。此时,类型位数的选择不会再局限于运行系统的位数。