天天看點

swift之數值類型雜談(數值)

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