数字是计算机语言的基础。由于计算机的物理结构,数字被分为两种基本类型:整数和浮点数。
1.整数(Integer)
Swift中的整数就是数学定义的整数,指没有小数点和小数部分的数。整数一般可以用来表示事物的数量,比如朋友圈的点赞数、购物车里的物品数以及书的页数等等。但是由于计算机存储的有限性,Swift中的整数是有范围的。讲到这里,读者肯定好奇最大值和最小值各是多少,本书可以直接给出答案,但这就违背了“实战出真知”的宗旨,还得读者自己动手写一下才能深刻记忆。首先,创建一个新的Playground,命名为“Integer”,输入如下代码:
动手写3.4.1 Integer
控制台输出如下:
控制台输出的为什么是这两个数呢?因为计算机用固定位数的二进制的形式保存整数(一般是8、16、32、64位),每一位都是一个0或1,每一位代表了2的不同次幂(类比十进制,每一位代表10的不同次幂)。要计算一个二进制数的值,只要找到每个存储了1的位,将它们对应的2的次幂相加即可。
在macOS中,Int默认是64位整数,也就是说它能表示264种数值。那么Int所能表达的数值范围是-263~(263-1),一共有264种可能,也就是上面代码所示的两个数值。
在iOS中,Int的位数相对复杂一些。苹果从iPhone 5S、iPad Air和带Retina屏幕的iPad mini开始引入64位设备,而更早的设备还是32位架构。如果开发者在给这些设备写应用,也就是以“64位CPU架构”为目标,那么Int默认的就是64位,跟macOS一样。如果开发者是以“32位CPU架构”为目标,比如iPhone 5或者iPad 2,那么Int默认的就是32位整数。编译器会在构建程序时选择合适的Int长度。
如果需要知道整数的精确长度,可以使用Swift的显示长度整数类型,比如Int32是Swift的32位有符号整型。我们用Int32来看看32位整数的最小和最大值。
动手写3.4.2 Integer32
控制台输出的为什么是这两个数呢?因为计算机用固定位数的二进制的形式保存整数(一般是8、16、32、64位),每一位都是一个0或1,每一位代表了2的不同次幂(类比十进制,每一位代表10的不同次幂)。要计算一个二进制数的值,只要找到每个存储了1的位,将它们对应的2的次幂相加即可。
在macOS中,Int默认是64位整数,也就是说它能表示264种数值。那么Int所能表达的数值范围是-263~(263-1),一共有264种可能,也就是上面代码所示的两个数值。
在iOS中,Int的位数相对复杂一些。苹果从iPhone 5S、iPad Air和带Retina屏幕的iPad mini开始引入64位设备,而更早的设备还是32位架构。如果开发者在给这些设备写应用,也就是以“64位CPU架构”为目标,那么Int默认的就是64位,跟macOS一样。如果开发者是以“32位CPU架构”为目标,比如iPhone 5或者iPad 2,那么Int默认的就是32位整数。编译器会在构建程序时选择合适的Int长度。
如果需要知道整数的精确长度,可以使用Swift的显示长度整数类型,比如Int32是Swift的32位有符号整型。我们用Int32来看看32位整数的最小和最大值。
动手写3.4.2 Integer32
控制台输出如下:
控制台输出如下:
对于8位、16位和64位有符号整型,相应的还有Int8、Int16、Int64。需要知道整数长度时,就用这些带长度的整型,比如使用一些算法(加密算法中比较常见)或者需要和其他计算机交换整数时(比如通过互联网发送数据)。这些类型只会出现在一些特殊的场景下,所以良好的Swift编程风格是在大部分情况下用Int。
到目前为止,本书所见过的整数类型都是有符号的,也就是说它们既能表示正数又能表示负数。实际上,Swift还提供了无符号整型,用来表示大于等于0的整数(一般的编程语言都提供有符号整型和无符号整型)。每个有符号整型(Int、Int16等)都有对应的无符号整型(UInt、UInt16等)。有符号整数和无符号整数的区别在于二进制层面最高位(对于8位整数来说是27)表示的是2的n次幂是正数或是负数。读者可以动手写下无符号整型所能表示的数值范围。
动手写3.4.3 UnsignedInteger(www.xing528.com)
对于8位、16位和64位有符号整型,相应的还有Int8、Int16、Int64。需要知道整数长度时,就用这些带长度的整型,比如使用一些算法(加密算法中比较常见)或者需要和其他计算机交换整数时(比如通过互联网发送数据)。这些类型只会出现在一些特殊的场景下,所以良好的Swift编程风格是在大部分情况下用Int。
到目前为止,本书所见过的整数类型都是有符号的,也就是说它们既能表示正数又能表示负数。实际上,Swift还提供了无符号整型,用来表示大于等于0的整数(一般的编程语言都提供有符号整型和无符号整型)。每个有符号整型(Int、Int16等)都有对应的无符号整型(UInt、UInt16等)。有符号整数和无符号整数的区别在于二进制层面最高位(对于8位整数来说是27)表示的是2的n次幂是正数或是负数。读者可以动手写下无符号整型所能表示的数值范围。
动手写3.4.3 UnsignedInteger
控制台输出如下:
控制台输出如下:
像Int一样,UInt在macOS中是64位整数,而在iOS中还是取决于CPU架构。所有无符号整型数的最小值都是0,而N位的无符号整型数的最大值是2N-1。比如64位无符号整型数的最大值就是264-1,即刚才代码中输出的18446744073709551615。
2.浮点数(Float)
除了整数,日常生活中还会用到小数。在计算机中用来表示小数的数字类型叫浮点数,它是以尾数和指数的形式存储的,类似于数学中的科学计数法。区别在于数学中的浮点数是以10为底数,而计算机中的浮点数是以2为底数。也是因为以2为底数,所以浮点数一般不能精确地表达小数,而是一个近似值。
Swift有两种基本的浮点数类型:32位浮点数Float和64位浮点数Double。Float和Double的长度差异并不像整数那样影响其最小值和最大值,而是影响其精度。Double的精度比Float高,这意味着它能存储更精确的近似值。在Swift中,浮点数的默认推断类型是Double,就像整数的不同类型一样,你也可以显式地声明Float和Double。这里读者可以动手声明一下浮点型,并为其赋值,示例如下:
动手写3.4.4 Float
像Int一样,UInt在macOS中是64位整数,而在iOS中还是取决于CPU架构。所有无符号整型数的最小值都是0,而N位的无符号整型数的最大值是2N-1。比如64位无符号整型数的最大值就是264-1,即刚才代码中输出的18446744073709551615。
2.浮点数(Float)
除了整数,日常生活中还会用到小数。在计算机中用来表示小数的数字类型叫浮点数,它是以尾数和指数的形式存储的,类似于数学中的科学计数法。区别在于数学中的浮点数是以10为底数,而计算机中的浮点数是以2为底数。也是因为以2为底数,所以浮点数一般不能精确地表达小数,而是一个近似值。
Swift有两种基本的浮点数类型:32位浮点数Float和64位浮点数Double。Float和Double的长度差异并不像整数那样影响其最小值和最大值,而是影响其精度。Double的精度比Float高,这意味着它能存储更精确的近似值。在Swift中,浮点数的默认推断类型是Double,就像整数的不同类型一样,你也可以显式地声明Float和Double。这里读者可以动手声明一下浮点型,并为其赋值,示例如下:
动手写3.4.4 Float
控制台输出如下:
控制台输出如下:
我们可以发现,浮点数隐式声明时,编译器提供的默认类型是Double,打印出的显示值和实际值有时候并不一致,1.3其实是用1.29999995进行近似表示的。
我们可以发现,浮点数隐式声明时,编译器提供的默认类型是Double,打印出的显示值和实际值有时候并不一致,1.3其实是用1.29999995进行近似表示的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。