2.3 初识基本数据类型
本节主要向读者介绍整型、浮点型、布尔型数据在Swift语言中的应用。
2.3.1 数学进制与计算机存储原理
所谓进制,是数学计算中人为规定的一套进位规则。生活中,人们习惯使用十进制进行数据计算,例如到文具店买3支铅笔,到菜市场买菜花费5元3角等。在数学与计算机领域除了十进制之外,二进制、八进制、十六进制的应用也十分广泛,进制的实质即是在数据计算时逢几进一(十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位)。
计算机是由逻辑电路组成的,逻辑电路通常只有两个状态,即开关的接通与断开,正好可以表示两种状态(0和1),对计算机而言,采用二进制不仅能够简化运算法则,提高运算效率,更具有很高的抗干扰能力和可靠性,因此二进制也被称为“机器的语言”。
Swift语言支持开发者使用多种进制进行数据的定义与计算,默认为十进制,如果有特殊需求,可以通过在数据前面加前缀的方式实现,示例如下:
var type_10 = 17; //十进制的17 var type_2 = 0b10001 //二进制的17 var type_8 = 0o21 //八进制的17 var type_16 = 0x11 //16进制的17
在进一步了解了数据类型的相关知识外,读者首先应该清楚几个概念,计算机内存中最小的数据运算单元是一个二进制位(bit),其只有两种状态:0或者1。字节(B)是最小的数据单元,1个字节由8个二进制运算位组成。针对无符号数来说,1个字节最大可以表示的数为二进制11111111即十进制数255。读者如果有一些编程经验,一定会对ASCII码十分熟悉,ASCII码的存储空间即1个字节的大小,因此其最多可以表示256个字符。在字节之上,还有千字节(KB)、兆字节(MB)、吉字节(GB)、太字节(TB)等,它们之间的换算关系如下:
1B=8bit
1KB=2^10B
1MB=2^10KB
1GB=2^10MB
1TB=2^10GB
1PB=2^10TB
2.3.2 整型数据
Swift语言中的整型数据分为有符号整型数据与无符号整型数据,所谓有符号与无符号,通俗的理解即为分正负号与不分正负号。
对于无符号整型,Swift中提供了5种类型4种存储空间的数据类型,分别对应占用8位、16位、32位、64位而进行运算位的存储空间。使用Xcode开发工具创建一个新的Playground,命名为BasicDataType,编写如下演示代码:
//8位无符号整型数的最大值 255 var a1 = UInt8.max //16位无符号整型数的最大值 65535 var a2 = UInt16.max //32位无符号整型数的最大值 4294967295 var a3 = UInt32.max //64位无符号整型数的最大值 18446744073709551615 var a4 = UInt64.max
上面代码中创建了4个变量a1, a2, a3, a4。在Swift语言中,整型数据类型实际上是采用结构体的方式实现的,其中max属性可以获取到当前类型的最大值。读者可能会有疑问,在实际开发中,到底应该选择哪一种类型来表达无符号整型呢?上面提到,Swift语言中的无符号整型实际有5种,还有1种为UInt类型,这种类型编译器会自动适配,在64位的机器上为UInt64,在32位的机器上为UInt32,示例代码如下:
//获取数据类型所占位数,在64位机器上UInt占8字节64位 var a5 = MemoryLayout<UInt>.size
MemoryLayout是Swift标准库中定义的一个枚举,顾名思义其实用于获取内存相关信息,MemoryLayout<UInt>则是一种泛型的用法,调用其size属性可以获取某种数据类型所占内存空间的字节数。
有符号整型数据与无符号整型数据十分类似,只是其首位二进制位为符号位,不纳入数值计算,示例代码如下:
var maxInt8 = Int8.max //127 var mimInt8 = Int8.min //-128 var maxInt16 = Int16.max //32767 var minInt16 = Int16.min //-32768 var maxInt32 = Int32.max //2147483647 var minInt32 = Int32.min //-2147483648 var maxInt64 = Int64.max //9223372036854775807 var minInt64 = Int64.min //-9223372036854775808 var intSize = sizeof(Int) //8位
与max属性对应,min属性用于获取整型数据的最小值。
2.3.3 浮点型数据
浮点型数据用来表示一些小数,浮点型数据分为单精度浮点型与双精度浮点型。分别用Float与Double表示,示例代码如下:
var b = MemoryLayout<Float>.size //4个字节 var b1 = MemoryLayout<Float32>.size //4个字节 var b2 = MemoryLayout<Float64>.size //8个字节 var b3 = MemoryLayout<Float80>.size //16个字节 var c = MemoryLayout<Double>.size //8个字节
Swift语言中也支持使用科学计数法来表示数字,在十进制中使用e来表示10的n次方,在十六进制中使用p来表示2的n次方,示例代码如下:
`
var sum = 1.25e3 //1.25*(10^3) = 1250
var sun2 = 0x1p3 //1*(2^3) = 8
Swift语言中还有一个十分有意思的特性,无论是整型数据还是浮点型数据,都可以在数字前加任意个0来进行位数填充,也可以在数字中加入下划线进行分隔,进而增加可读性,这些操作并不会影响原始数值,却提高了对开发者的编程友好性,使代码的结构更加清爽,示例如下:
var num1 = 001.23 //1.23 var num2 = 1_000 //1000 var num3 = 1_000.1_ 001 //1000.1001
2.3.4 布尔型数据
布尔类型很多时候也叫作逻辑类型,熟悉Objective-C编程语言的读者可能会了解,在Objective-C语言中,BOOL类型其实并非严格意义上的逻辑布尔类型,Objective-C中可以使用0与非零来表达逻辑假与逻辑真。而在Swift语言中则不同,Swift语言的Bool类型十分严格,只有true和false两种值,分别表示真和假。同样,在Swift语言的条件语句以及需要进行逻辑判断的语句中,所使用的条件表达式的值也必须为Bool类型。
创建真与假的布尔值示例代码如下:
var bool1 = true //创建布尔真变量 var bool2 = false //创建布尔假变量