内置数值类型
Kotlin和Java的数值类型很接近,内置了6中数值类型:
Double:64
Float:32
Long:64
Int:32
Short:16
Byte:8
在Java里,char类型也是一种数值类型,可以和其他数值类型转换,而在Kotlin则没有把char类型作为数值类型。
字面量
整数
整数类型:Shot,Int和Long。和Java一样,Long类型的字面量在数字后面加上L来表示。
整数支持十进制,十六进制以及二进制的表示方式,不支八进制。
- 十进制:十进制直接使用数字,123
- 十六进制:在数字前加上0x,0xF0
- 二进制:在数字前加上0b,0b101010
浮点型
浮点型类型:Float和Double。默认的浮点型为Double类型,Float类型在数字后面添加f。
- Double:123.5, 123.5e10
- Float:123.5f
下划线(Kotlin1.1开始)
为了增强数值的可读性,可以使用下划线隔开数字:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
表现
在Kotlin里,所有的数值类型都是包装类型。这与Java的数值类型可以在基本类型或包装类型之间选择使用是不同的。
使用包装类型做数值比较时表现会有所不同。
全等比较(===)
val a: Int = 10000
print(a === a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!!
虽然boxedA和anotherBoxedA都是赋值为a,全等比较的是对象,两者为不同对象,所有全等比较为false。
相等比较(==)
val a: Int = 10000
print(a == a) // Prints 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // Prints 'true'
相等比较的是数值,boxedA和anotherBoxedA相等。
显式转换
Kotlin里不支持直接把小类型的数值赋值给大类型的数值
val b: Byte = 1 // OK, literals are checked statically
val i: Int = b // ERROR
如果要把小类型的数值赋值给大类型的数值,需要显式转换。
val i: Int = b.toInt() // OK: explicitly widened
相关显式转换的方法:
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
隐式转换
但需要注意的是,Kotlin也是存在隐式转换,在做数值运算时会有这样的转换:
val l = 1L + 3 // Long + Int => Long
Long和Int相加,得到的结果为Long。
运算
Kotlin支持标准的算术运算符,而且这些运算符可以使用函数重载。
例如:
- a + b:a.plus(b)
- a - b:a.minus(b)
- a * b:a.times(b)
- a / b:a.div(b)
- a % b:a.rem(b)
- a..b:a.rangeTo(b)
但是位运算符是没有对象的符号,使用的是函数。例如
val x = (1 shl 2) and 0x000FF000
这里1左移两位,对应Java里的1<<2。
完整的位运算函数如下:
- shl(bits) – 有符号左移(Java的 <<)
- shr(bits) – 有符号右移 (Java的 >>)
- ushr(bits) – 无符号右移 (Java的 >>>)
- and(bits) – 按位与
- or(bits) – 按位或
- xor(bits) – 按位异或
- inv() – 按位取反