Swift编程语言学习1.4——数值型字面量、数值类型转换

时间:2024-08-14 16:37:02

数值型字面量

整数字面量能够被写作:

一个十进制数,没有前缀

一个二进制数,前缀是0b

一个八进制数,前缀是0o

一个十六进制数,前缀是0x

以下的全部整数字面量的十进制值都是17:

let decimalInteger = 17
let binaryInteger = 0b10001 // 二进制的17
let octalInteger = 0o21 // 八进制的17
let hexadecimalInteger = 0x11 // 十六进制的17

浮点字面量能够是十进制(没有前缀)或者是十六进制(前缀是0x)。小数点两边必须有至少一个十进制数字(或者是十六进制的数字)。

浮点字面量另一个可选的指数(exponent),在十进制浮点数中通过大写或者小写的e来指定,在十六进制浮点数中通过大写或者小写的p来指定。

假设一个十进制数的指数为exp,那这个数相当于基数和10exp的乘积:

1.25e2 表示 1.25×102,等于 125.0。

1.25e-2 表示 1.25×10−2,等于 0.0125。

假设一个十六进制数的指数为exp。那这个数相当于基数和2exp的乘积:

0xFp2 表示 15×22,等于 60.0。

0xFp-2 表示 15×2−2。等于 3.75。

以下的这些浮点字面量都等于十进制的12.1875:

let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0

数值类字面量能够包括额外的格式来增强可读性。整数和浮点数都能够加入额外的零而且包括下划线,并不会影响字面量:

let paddedDouble = 000123.456
let oneMillion = 1_000_000
let justOverOneMillion =1_000_000.000_000_1

数值型类型转换

通常来讲。即使代码中的整数常量和变量已知非负。也请使用Int类型。

总是使用默认的整数类型能够保证你的整数常量和变量能够直接被复用而且能够匹配整数类字面量的类型猜測。

仅仅有在必要的时候才使用其它整数类型。比方要处理外部的长度明白的数据或者为了优化性能、内存占用等等。使用显式指定长度的类型能够及时发现值溢出而且能够暗示正在处理特殊数据。

整数转换  

不同整数类型的变量和常量能够存储不同范围的数字。Int8类型的常量或者变量能够存储的数字范围是-128~127,而UInt8类型的常量或者变量能存储的数字范围是0~255。

假设数字超出了常量或者变量可存储的范围,编译的时候会报错:

let cannotBeNegative: UInt8 = -1
// UInt8 类型不能存储负数。所以会报错
let tooBig: Int8 = Int8.max + 1
// Int8 类型不能存储超过最大值的数,所以会报错

因为每中整数类型都能够存储不同范围的值,所以你必须依据不同情况选择性使用数值型类型转换。这样的选择性使用的方式,能够预防隐式转换的错误并让你的代码中的类型转换意图变得清晰。

要将一种数字类型转换成还有一种,你要用当前值来初始化一个期望类型的新数字。这个数字的类型就是你的目标类型。在以下的样例中,常量twoThousand是UInt16类型,然而常量one是Uint8类型。它们不能直接相加。由于它们类型不同。

所以要调用UInt16(one)来创建一个新的UInt16数字并用one的值来初始化,然后使用这个新数字来计算:

let twoThousand: UInt16 = 2_000

let one: UInt8 = 1
let twoThousandAndOne = twoThousand +UInt16(one)

如今两个数字的类型都是UInt16,能够进行相加。目标常量twoThousandAndOne的类型被猜測为UInt16,由于它是两个UInt16值的和。

SomeType(ofInitialValue)是调用 Swift 构造器并传入一个初始值的默认方法。在语言内部,UInt16有一个构造器,能够接受一个UInt8类型的值,所以这个构造器能够用现有的UInt8来创建一个新的UInt16。注意,你并不能传入随意类型的值,仅仅能传入UInt16内部有相应构造器的值。

只是你能够扩展现有的类型来让它能够接收其它类型的值(包含自己定义类型)。请參考扩展。

整数和浮点数转换

整数和浮点数的转换必须显式指定类型:

<pre name="code" class="java">let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) +pointOneFourOneFiveNine
// pi 等于 3.14159,所以被猜測为Double 类型

这个样例中,常量three的值被用来创建一个Double类型的值,所以加号两边的数类型同样。假设不进行转换,两者无法相加。

浮点数到整数的反向转换相同行,整数类型能够用Double或者Float类型来初始化:

let integerPi = Int(pi)
// integerPi 等于 3,所以被猜測为 Int 类型

当用这样的方式来初始化一个新的整数值时。浮点值会被截断。

也就是说4.75会变成4,-3.9会变成-3。

注意:

结合数字类常量和变量不同于结合数字类字面量。

字面量3能够直接和字面量0.14159相加,由于数字字面量本身没有明白的类型。它们的类型仅仅在编译器须要求值的时候被猜測。