swift之数值类型杂谈(数值)

最后更新于:2022-04-01 11:39:31

~~~ import Foundation //整数,没有小数部分,有正数有负数 /* Swift 提供了8,16,32和64位的有符号和⽆符号整数类型。这些整数类型和 C 语⾔的命 名⽅式很像,⽐如8位⽆符号整数类型是 UInt8 ,32位有符号整数类型是 Int32 。就像 Swift 的其他类型⼀样,整数类型采⽤⼤写命名法。 */ var x8 : Int8 = 10 var x16 : Int16 = 10 var x32 : Int32 = 0 var x64 : Int64 = -10 var ux8 : UInt16 = 20 //不再多说 //整数范围 var minInt32 = Int32.min var maxInt32 = Int32.max print("int32.min = \(minInt32), int32.max = \(maxInt32)") //int32.min = -2147483648, int32.max = 2147483647 /* ⼀般来说,不需要专⻔指定整数的⻓度。Swift 提供了⼀个特殊的整数类型 Int ,⻓度与 当前平台的原⽣字⻓相同: 在32位平台上 Int 和 Int32长度相同 在64位平台上 Int 和 Int64长度相同 UInt 也是一样 在32位平台上 UInt 和 UInt32长度相同 在64位平台上 UInt 和 UInt64长度相同 尽量不要使⽤ UInt ,除⾮你真的需要存储⼀个和当前平台原⽣字⻓相同的⽆符号整 数。除了这种情况,最好使⽤ Int ,即使你要存储的值已知是⾮负的。统⼀使 ⽤ Int 可以提⾼代码的可复⽤性,避免不同类型数字之间的转换 */ //浮点数 /* Double 表⽰64位浮点数。当你需要存储很⼤或者很⾼精度的浮点数时请使⽤此类型。 Float 表⽰32位浮点数。精度要求不⾼的话可以使⽤此类型。 Double 精确度很⾼,⾄少有15位数字,⽽ Float 最少只有6位数字。选择哪个类型取 决于你的代码需要处理的值的范围。 */ //类型推断 /* Swift 是⼀个类型安全(type safe)的语⾔。类型安全的语⾔可以让你清楚地知道代码要 处理的值的类型。如果你的代码需要⼀个 String ,你绝对不可能不⼩⼼传进去⼀个 Int 。 由于 Swift 是类型安全的,所以它会在编译你的代码时进⾏类型检查(type checks),并 把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。 当你要处理不同类型的值时,类型检查可以帮你避免错误。然⽽,这并不是说你每次声明 常量和变量的时候都需要显式指定类型。如果你没有显式指定类型,Swift 会使⽤_类型推 断(type inference)来选择合适的类型。有了类型推断,编译器可以在编译代码的时候 ⾃动推断出表达式的类型。原理很简单,只要检查你赋的值即可 */ let value1 = 15 //value1会被推断为Int let value2 = 12.88 //value2会被推断为Double // 当推断浮点数的类型时,Swift 总是会选择 Double ⽽不是 Float let value3 = 2 + 11.00 //valuew3 会被推断为Double //因为:如果表达式中同时出现了整数和浮点数,会被推断为 Double 类型 //数值类型: /* ⼀个⼗进制数,没有前缀 ⼀个⼆进制数,前缀是 0b ⼀个⼋进制数,前缀是 0o ⼀个⼗六进制数,前缀是 0x */ let decimalInteger = 17 let binaryInteger = 0b10001 // ⼆进制的17 let octalInteger = 0o21 // ⼋进制的17 let hexadecimalInteger = 0x11 // ⼗六进制的17 print("十进制:\(decimalInteger), 二进制:\(binaryInteger), 八进制:\(octalInteger), 十六进制:\(hexadecimalInteger)") //十进制:17, 二进制:17, 八进制:17, 十六进制:17 //如果⼀个⼗进制数的指数为 exp ,那这个数相当于基数和10^exp的乘积: var testEXP = 3.33e5 // = 333000 var testEXPfu = 3.33e-2 print("\(testEXP) - \(testEXPfu)") //输出:333000.0 - 0.0333 var testexp2 = 0xAp3 // = 10 * (2 * 2 * 2) = 80 var testexp2fu = 0xap-3 print("\(testexp2) - \(testexp2fu)") //输出:80.0 - 1.25 //数值类字⾯量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字⾯量: let paddedDouble = 000123.456 let oneMillion = 1_000_000 let justOverOneMillion = 1_000_000.000_000_1 //下划线和0不会影响原有值 //数值类型转换 /* 不同整数类型的变量和常量可以存储不同范围的数字。 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 的值来初始化,然后使⽤这个新数字来计算: */ var twoThousand: UInt16 = 2_000 var one: UInt8 = 1 var twoThousandAndOne = twoThousand + UInt16(one) //整数和浮点类型的转换 var valueInt = 12 var valueDouble = 10.11 var valueTotal = Double(valueInt) + valueDouble print(valueTotal) //输出:22.11 var valueTotalToInt = Int(valueTotal) print(valueTotalToInt) //输出:22 //此时会发生截断 //类型别名 typealias DZL = Int32 var t1 : DZL = 111 //布尔值 //Swift 有两个布尔常量, true 和 false var boolType : Bool = true ~~~
';