Swift编程语言学习1.4——数值型字面量、数值类型转换
数值型字面量
整数字面量能够被写作:
一个十进制数,没有前缀
一个二进制数,前缀是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相加,由于数字字面量本身没有明白的类型。它们的类型仅仅在编译器须要求值的时候被猜測。
Swift编程语言学习1.4——数值型字面量、数值类型转换的更多相关文章
- Swift - 05 - 数值型字面量
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- js 正则学习小记之匹配字符串字面量优化篇
昨天在<js 正则学习小记之匹配字符串字面量>谈到 个字符,除了第一个 个,只有 个转义( 个字符),所以 次,只有 次成功.这 次匹配失败,需要回溯后用 [^"] 才能匹配成功 ...
- Swift编程语言学习9—— 存储属性和计算属性
属性将值跟特定的类.结构或枚举关联.存储属性存储常量或变量作为实例的一部分,计算属性计算(而不是存储)一个值.计算属性能够用于类.结构体和枚举里,存储属性仅仅能用于类和结构体. 存储属性和计算属性通经 ...
- Swift编程语言学习1.3——类型安全和投机型
Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...
- Swift编程语言学习6—— 闭包
闭包是自包括的函数代码块,能够在代码中被传递和使用. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其它一些编程语言中的 lambdas 函数比較类似. 闭 ...
- Swift编程语言学习3.1排列
Swift 语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储同样类型的数据.字典尽管无序存储同样类型数据值可是须要由独有的标识符引用和寻址(就是键值对). Swift 语言里的数 ...
- Swift 编程语言学习0.1——Swift简单介绍
有的时候,认为看英文文档有些费时,看中文文档怕翻译不准,有些地方确实不须要抠字眼.当有些地方假设翻译不精准会产生歧义,所以用这样对比的方式.顺便学习一下Swift. Swift is a new pr ...
- Swift编程语言学习4.3—— 控制语句
控制传递语句(Control Transfer Statements) 控制转移语句改变你代码的运行顺序,通过它你能够实现代码的跳转.Swift有四种控制转移语句. continue break fa ...
- Swift编程语言学习2.1——基础运营商(在)
操作员正在检查,更改.归并值特殊符号或短语.例如,加+这两个数字相加(例如let i = 1 + 2). 算如更复杂的逻辑和操作的实施&&(例如if enteredDoorCode & ...
随机推荐
- A - Prime Ring Problem(素数环,深搜,打表)
Description A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into ...
- JAVA 软件升级版本号比较
简单版本号比较: public class CompareVersion { public static void main(String[] args) { // TODO Auto-gener ...
- BZOJ 1263: [SCOI2006]整数划分( 高精度 )
yy一下发现好像越小越好...分解成3*3*3*3……这种形式是最好的...然后就是高精度了 ----------------------------------------------------- ...
- 深度优先搜索(DFS)递归形式改为非递归形式
DFS将递归改为非递归这个方法的需求来自于一道三维积木组合的题目,还在苦苦调试中,暂且不提. 普通的认识对于递归向非递归的转化无非是使用栈,但是结合到深度搜索如何将栈很好利用,如何很好保存现场,都不是 ...
- WinDbg分析DUMP文件
1. 如何生成dump文件? 原理:通过SetUnhandledExceptionFilter设置捕获dump的入口,然后通过MiniDumpWriteDump生成dump文件: ...
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- BZOJ 2287: 【POJ Challenge】消失之物( 背包dp )
虽然A掉了但是时间感人啊.... f( x, k ) 表示使用前 x 种填满容量为 k 的背包的方案数, g( x , k ) 表示使用后 x 种填满容量为 k 的背包的方案数. 丢了第 i 个, 要 ...
- Python 第五篇(上):算法、自定义模块、系统标准模块(time 、datetime 、random 、OS 、sys 、hashlib 、json和pickle)
一:算法回顾: 冒泡算法,也叫冒泡排序,其特点如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应 ...
- 一天一个类,一点也不累之TreeSet
一天一个类,一点也不累. 现在要说的是---TreeSet public class TreeSet<E> extends AbstractSet<E> implements ...
- ORA-19815,ORA-19809 :limit exceeded for recovery files
数据库重新启动的时候,收到了ORA-19815的错误.从错误的提示来看,是由于闪回区的空间被填满导致无法成功启动.这种情形我们通常考虑的是清除归档日志,那就直接在OS层面rm了,真的是这样吗?客官,如 ...