kotlin 中的数字

以下均来自官方文档:

一、整数类型

1、kotlin中内置的整数类型,有四种不同大小的类型:

类型存储大小(比特数)最小值最大值
Byte8-128127
Short16-3276832767
Int32-2,147,483,648 (-231)2,147,483,647 (231 - 1)
Long64-9,223,372,036,854,775,808 (-263)9,223,372,036,854,775,807 (263 - 1)

注:

当初始化一个没有显示指定类型的变量时,编译器会自动推断为自Int起足以表示该值的最小类型。意思是:如果不超过Int范围,那么类型为Int,如果超过了,那么类型是Long。如果指定值类型为Long类型,请给该值追加后缀L。如果显示的指定类型,会触发编译器检测该值是否超过指定类型的范围。

2、代码演示

// val或var来定义a = 1,打印类型,默认为java的int类型
fun main() {
    val a = 1
    // Kotlin的类型信息在运行时是基于JVM的,所以可以利用Java的反射API来获取类型信息
    println("类型为: ${a.javaClass.simpleName}") // 类型为: int
}

输出结果: 

 

// 下边打印输出类型为long类型,因为类型推断超出Int类型,所以输出long类型
fun main() {
    val a = 10000000000000
    println("类型为: ${a.javaClass.simpleName}") // 类型为: long
}

输出结果: 

显示指定Long类型

// 值后边加上L,来显示指定Long类型,或者 定义Long类型
fun main() {
    val a = 100L
    val b: Long = 100
    println("类型为: ${a.javaClass.simpleName}") // 类型为: long
    println("类型为: ${b.javaClass.simpleName}") // 类型为: long
}

二、浮点类型

1、kotlin中内置的浮点类型:单精度Float与双精度Double类型

这两个类型的大小不同,并为两种不同精度的浮点数提供存储:

类型大小(比特数)有效数字比特数指数比特数十进制位数
Float322486-7
Double64531115-16

可以使用带小数部分的数字初始化Double与Float变量。小数部分与整数部分之间用点 .  分割,对于以小数初始化的变量,编译器会自动推断为Double类型:

fun main() {
    val a = 100.1
    println("类型为: ${a.javaClass.simpleName}") // 类型为: double
}

如果需要将一个值显式指定为Float类型,请添加 f F 后缀。如果值包含多于6到7位十进制数,那么会将其四舍五入:

// 实际测试Float类型多于4到5位十进制数,都会四舍五入,不知为啥!
fun main() {
    val a = 100.31415966 // 默认推断Double类型
    val b = 100.3141596f // 指定Float类型
    println("a为: ${a}") // a为: 100.31415966
    println("b为: ${b}") // b为: 100.31416
}

三、数字的装箱拆箱

1、在jvm平台,数字的存储为原生类型 int、double等。有例外的情况是:当创建可空数字引用如:泛型、Int? ···。在这些场景中,数字会装箱为JAVA类 Integer、Double等。

解释一下:在java世界里,有两种存放数字的方式:
(1)直接存储数字(原生类型):
        就像你在口袋里直接放了几块糖,你知道那是几块,可以直接用。在Java中,intdouble这些就是这种类型的糖,它们直接存数字,速度快,效率高。比如,你有个int num = 5;,这里的num就像你口袋里的5块糖,很直接。
(2)把数字放进盒子中,在存储(装箱类型):
        有时候,你可能想要更灵活一点,比如说,你的糖可能会没有(因为没买或者吃完了),这时候你就需要一个盒子来帮助你表示“有糖”或“没糖”。在Java中,如果你用IntegerDouble这样的类型,就像是给糖准备了个盒子。当你写Integer num = null;或用在泛型、可空类型如Int?时,就相当于,这个盒子里可能有糖(具体的数字),也可能什么都没有(null)。
装箱就是把简单直接的糖(原生类型)包装进一个盒子(变成对象,如Integer),这样可以做更多事情,比如表示“无糖状态”,但相对的,操作起来比直接拿糖要麻烦一点,因为每次要用糖时,都要从盒子里拿出来(拆箱)。
原生类型(如intdouble)直接存储数值,效率高;而像IntegerDouble这样的装箱类型,则是把数值包装成对象,可以表示额外的“无值”状态,但在使用时涉及到自动装箱和拆箱,稍微复杂一些。

2、代码演示

fun main() {
    val a: Int = 100
    // 装箱,赋值为可空的b
    val b: Int? = a
    // 装箱,赋值为可空的c
    val c: Int? = a

    val d: Int = 10000
    // 装箱,赋值为可空的e
    val e: Int? = d
    // 装箱,赋值为可空的f
    val f: Int? = d

    println(b === c) // true
    println(e === f) // false
}

解释:

上边代码演示了装箱(boxing)和常量池(constant pool)的概念,这是理解打印结果差异的关键。
在Kotlin中,当一个原始类型(如Int)被赋值给一个可空类型(如Int?),这个过程被称为装箱,即原始类型值被封装成一个对象。但是,为了优化性能,Kotlin(以及Java)会对特定范围内的Int值(通常是-128到127)使用缓存,这意味着在这个范围内的值在装箱时会复用同一个对象。这就是所谓的享元模式(Flyweight Pattern),可以减少内存使用并提高效率。
分析代码:

  • 对于变量a,它的值是100,处于上述的缓存范围(-128到127)内。所以,当a被装箱赋值给bc时,这两个变量实际上引用的是同一个缓存中的Integer对象。因此,b === c比较的是两个对象的引用是否相同,结果为true,表示它们确实是同一个对象。

  • 变量d的值是10000,超出了常量池的缓存范围。因此,当d被装箱为e和f时,会为每个变量创建一个新的Integer对象,即使它们的值相同。这意味着ef是两个不同的对象,即使它们的数值相等。因此,e=== f比较的是不同对象的引用,结果为false

总结:

打印结果的不同是因为值为100的Int对象在装箱时被缓存并复用,而值为10000的Int对象由于超出缓存范围,每次装箱都会创建新的对象实例。这就解释了为什么第一个比较结果为true而第二个为false

再来看一段代码:

fun main() {
    val a: Int = 10000
    // 装箱,赋值为可空的b
    val b: Int? = a
    // 装箱,赋值为可空的c
    val c: Int? = a

    println(b == c) // true
}

为什么上边代码打印结果为true?

解释:

b == c打印出true的原因在于这里使用的是==操作符来进行比较,而不是===。在Kotlin中,==用于比较两个对象的内容(值)是否相等,而===用于比较两个引用是否指向同一个对象(即它们是否完全相同)。

分析代码:

当比较的是两个装箱的Int?类型变量(bc)时,==操作符会触发自动拆箱(unboxing),并将它们的原始Int值进行比较。在这个例子中,bc虽然是两个不同的对象(因为它们是分别装箱得到的),但它们的内部整数值都是10000,所以b == c的结果为true

总结:

b == c是比较的两个变量的值是否相等,而不是它们是否是同一个对象,所以结果是true

四、类型转换

1、数字类型的互转

  • toByte(): 转Byte类型 
  • toShort(): 转Short类型
  • toInt(): 转Int类型
  • toLong(): 转Long类型
  • toFloat(): 转Float类型
  • toDouble(): 转Double类型
fun main() {
    val a = 1 // 默认会推断为Int类型
    println(a.toByte()) // 1
    println(a.toInt()) // 1
    println(a.toFloat()) // 1.0
    println(a.toDouble()) // 1.0
    println(a.toLong()) // 1
    println(a.toShort()) // 1
}

五、大小比较及区间检测

1、kotlin中大小比较跟java一样

  • 相等性检测:a == b 与 a != b
  • 比较操作符:a < b、 a > b、 a <= b、 a >= b
  • 区间实例以及区间检测:a..b、 x in a..b、 x !in a..b

代码演示(.. 区间):

// a..b 表示从a到b这个区间
fun main() {
    for (i in 1..100){
        println(i) // 会打印1-100 的数字
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/702462.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图片导入AutoCAD建立草图—CAD图像导入插件

插件介绍 CAD图像导入插件可将PNG&#xff0c;JPG等格式图片导入到AutoCAD软件内建立图像边缘的二维线条模型。插件可以提取图像黑色或白色区域的边界&#xff0c;并可绘制原状边界或平滑边界两种样式。 模型说明 边界提取&#xff0c;黑色或白色边界的提取根据原图类型选择…

c#调用c++dll方法

添加dll文件到debug目录&#xff0c;c#生成的exe的相同目录 就可以直接使用了&#xff0c;放在构造函数里面测试

排序的时间复杂度、空间复杂度和稳定性等的比较

时间复杂度和空间复杂度我们比较熟悉&#xff0c;重点来看一下稳定性。 稳定性是指假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff0c;这些记录的相对次序保持不变&#xff0c;即在原序列中&#xff0c;a[i] a[j] &…

Golang 百题(实战快速掌握语法)_1

整形转字符串类型 实验介绍 本实验将展示三种方法来实现整形类型转字符串类型。 知识点 strconvfmt Itoa 函数 代码实例 Go 语言中 strconv 包的 itoa 函数输入一个 int 类型&#xff0c;返回转换后的字符串。下面是一个例子。 package mainimport ("fmt"&qu…

跟TED演讲学英文:Toward a new understanding of mental illness by Thomas Insel

Toward a new understanding of mental illness Link: https://www.ted.com/talks/thomas_insel_toward_a_new_understanding_of_mental_illness Speaker: Thomas Insel Date: January 2013 文章目录 Toward a new understanding of mental illnessIntroductionVocabularySum…

【C语言】联合(共用体)

目录 一、什么是联合体 二、联合类型的声明 三、联合变量的创建 四、联合的特点 五、联合体大小的计算 六、联合的应用&#xff08;判断大小端&#xff09; 七、联合体的优缺点 7.1 优点 7.2 缺点 一、什么是联合体 联合也是一种特殊的自定义类型。由多个不同类型的数…

测长仪的发展历程!

测长仪的发展历程可以大致分为以下几个阶段&#xff1a; 早期发展&#xff1a; 最早的测量工具主要是一些机械式测量工具&#xff0c;如角尺、卡钳等。 16世纪&#xff0c;在火炮制造中已开始使用光滑量规。 1772年和1805年&#xff0c;英国的J.瓦特和H.莫兹利等先后制造出利用…

Win快速删除node_modules

在Windows系统上删除 node_modules 文件夹通常是一个缓慢且耗时的过程。这主要是由于几个关键因素导致的&#xff1a; 主要原因 文件数量多且嵌套深&#xff1a; node_modules 文件夹通常包含成千上万的子文件夹和文件。由于其结构复杂&#xff0c;文件和文件夹往往嵌套得非常…

XXL-JOB分布式任务调度快速入门

文章目录 概念快速启动XXL-JOB调度初始化执行器项目配置执行器新增GLUE模式(Java)的任务新增BEAN模式&#xff08;类形式&#xff09;的任务BEAN模式&#xff08;方法形式&#xff09;的任务参考来源 概念 XXL-JOB是一个开源的分布式任务调度平台&#xff0c;它是一个轻量级、…

使用B树实现员工(人事)管理系统

1. 前言 使用B树来表示人事管理系统&#xff0c;其中每个节点代表一个人员&#xff0c;树的根节点为董事长&#xff0c;每个节点可以有多个子节点&#xff0c;表示下属。每一层代表一个等级分布。 addPerson: 添加人员功能通过查找指定上司节点&#xff0c;然后将新的人员作…

程序员/码农创业有多少种可能?

程序员创业&#xff0c;无疑是当下科技浪潮中的一股强大力量。凭借扎实的技术功底和敏锐的市场洞察力&#xff0c;在创业道路上展现出了无限的活力和创造力。那么&#xff0c;程序员创业究竟有哪些事情可以做呢&#xff1f;可以从技术产品的研发入手。 可以利用自己的专业知识…

分析GIS在疾病传播模型和公共卫生决策中的作用

在这个全球化日益加深的时代&#xff0c;疾病的跨国界传播成为全球公共卫生面临的重大挑战。地理信息科学&#xff08;GIS&#xff09;作为一门集成了空间数据采集、处理、分析及可视化的技术体系&#xff0c;在公共健康领域展现出其不可替代的价值。本文旨在深入探讨GIS如何助…

电动两轮车——电源方案

随着城镇化的发展人们的活动半径不断变宽&#xff0c;短交通出行方式仍能覆盖主要的范围。从主要国家核心地区的出行数据看平均通勤半径不高于15km&#xff0c;摩托车、电动两轮车等两轮出行方式能更好匹配日常短交通出行需求。 应用框图 通常&#xff0c;电动两轮车由三部分…

3D gaussian-splatting项目环境配置记录

1.前景 项目论文&#xff1a;https://arxiv.org/abs/2308.04079 GitHub项目下载地址&#xff1a;https://github.com/graphdeco-inria/gaussian-splatting git clone时里面的子模块小项目会git不到&#xff0c;需要单独github下来&#xff0c;放入相应文件夹。 sibr_viewer…

C# WinForm —— 33 ContextMenuStrip介绍

1. 简介 右键某个控件/窗体时&#xff0c;弹出来的菜单&#xff0c;比如VS中右键窗体&#xff0c;弹出来的这个菜单&#xff1a; 和MenuStrip类似&#xff0c;ContextMenuStrip主菜单下面可以有子菜单&#xff0c;子菜单下面可以有下一级子菜单 2. 属性 和MenuStrip一样 …

第6章 应用层

考纲内容 &#xff08;一&#xff09;网络应用模型 客户/服务器模型&#xff1b;P2P模型 &#xff08;二&#xff09;域名系统(DNS) 层次域名空间&#xff1b;域名服务器&#xff1b;域名解析过程 &#xff08;三&#xff09;文件传输协议(FTP) …

升级和维护老旧LabVIEW程序

在升级老旧LabVIEW程序至64位环境时&#xff0c;需要解决兼容性、性能和稳定性等问题。本文从软件升级、硬件兼容性、程序优化、故障修复等多个角度详细分析。具体包括64位迁移注意事项、修复页面跳转崩溃、解决关闭程序后残留进程的问题&#xff0c;确保程序在新环境中的平稳运…

[Java基本语法] 从0到1带你精通Java基本语法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效

undetected_chromedriver驱动浏览器结束报错OSError: [WinError 6] 句柄无效 问题背景 使用undetected_chromedriver包驱动浏览器结束后报错句柄无效 Exception ignored in: <function Chrome.del at 0x000001DD50F07A60> Traceback (most recent call last): File “D:…

ESP32 IDF ADF 加入音频

需要把mp3制作成音频bin 用ADF自带工具 果用户需要生成自己的 audio-esp.bin&#xff0c;则需要执行 mk_audio_bin.py 脚本&#xff08;位于 $ADF_PATH/tools/audio_tone/mk_audio_tone.py&#xff09;&#xff0c;并且指定相关文件的路径。 源 MP3 文件在 tone_mp3_folder …