Kotlin:基本类型 - 数值

时间:2022-02-04 16:11:37

内置数值类型

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() – 按位取反