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

来源:互联网 发布:车载导航软件哪个最好 编辑:程序博客网 时间:2024/05/29 16:34


import Foundation//整数,没有小数部分,有正数有负数/*Swift 提供了8,16,32和64位的有符号和⽆符号整数类型。这些整数类型和 C 语⾔的命名⽅式很像,⽐如8位⽆符号整数类型是 UInt8  ,32位有符号整数类型是 Int32  。就像Swift 的其他类型⼀样,整数类型采⽤⼤写命名法。*/var x8 : Int8 = 10var x16 : Int16 = 10var x32 : Int32 = 0var x64 : Int64 = -10var ux8 : UInt16 = 20//不再多说//整数范围var minInt32 = Int32.minvar maxInt32 = Int32.maxprint("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会被推断为Intlet value2 = 12.88//value2会被推断为Double// 当推断浮点数的类型时,Swift 总是会选择 Double  ⽽不是 Floatlet value3 = 2 + 11.00//valuew3 会被推断为Double//因为:如果表达式中同时出现了整数和浮点数,会被推断为 Double  类型//数值类型:/*⼀个⼗进制数,没有前缀⼀个⼆进制数,前缀是 0b⼀个⼋进制数,前缀是 0o⼀个⼗六进制数,前缀是 0x*/let decimalInteger = 17let binaryInteger = 0b10001 // ⼆进制的17let octalInteger = 0o21 // ⼋进制的17let hexadecimalInteger = 0x11 // ⼗六进制的17print("十进制:\(decimalInteger), 二进制:\(binaryInteger), 八进制:\(octalInteger), 十六进制:\(hexadecimalInteger)")//十进制:17, 二进制:17, 八进制:17, 十六进制:17//如果⼀个⼗进制数的指数为 exp  ,那这个数相当于基数和10^exp的乘积:var testEXP = 3.33e5 // = 333000var testEXPfu = 3.33e-2print("\(testEXP) - \(testEXPfu)")//输出:333000.0 - 0.0333var testexp2 = 0xAp3 // = 10 * (2 * 2 * 2) = 80var testexp2fu = 0xap-3print("\(testexp2) - \(testexp2fu)")//输出:80.0 - 1.25//数值类字⾯量可以包括额外的格式来增强可读性。整数和浮点数都可以添加额外的零并且包含下划线,并不会影响字⾯量:let paddedDouble = 000123.456let oneMillion = 1_000_000let 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_000var one: UInt8 = 1var twoThousandAndOne = twoThousand + UInt16(one)//整数和浮点类型的转换var valueInt = 12var valueDouble = 10.11var valueTotal = Double(valueInt) + valueDoubleprint(valueTotal)//输出:22.11var valueTotalToInt = Int(valueTotal)print(valueTotalToInt)//输出:22//此时会发生截断//类型别名typealias DZL = Int32var t1 : DZL = 111//布尔值//Swift 有两个布尔常量, true  和 falsevar boolType : Bool = true


0 0