Java类型转换和类型提升

目录

一、类型转换

1.1 自动类型转换(隐式)

1.1.1 int 与 long 之间

1.1.2 float 与 double 之间

1.1.3 int 与 byte 之间

1.2 强制类型转换(显示)

1.2.1 int 与 long 之间 

1.2.2 float 与 double 之间 

1.2.3 int 与 double 之间

1.2.4 int 与 byte 之间

二、类型提升

2.1 int 与 long 之间

2.2 byte 与 byte 之间


        Java作为一个强类型的编程语言,当不同类型进行相互赋值的时候,会有严格的校验。

就比如下面这几行代码。

int a = 10 ;
long b = 100L ;
b = a ; // 可以通过编译
a = b ; // 编译失败
如上代码,将int型变量a赋值给long型b的时候可以通过编译,但是将长整型变量b赋值给a的时候会编译失败。出现这样的情况就是因为Java对数据具有严格都校验。那么接下来小编就为大家分享一下,Java中,数据之间的赋值是发生怎样的类型转换和提升的。
在java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显示)。

一、类型转换

1.1 自动类型转换(隐式)

自动类型转换:代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。

特点:数据范围小的转为数据范围大的时自动进行。

1.1.1 int 与 long 之间

int a = 100;
long b = 10L;
b = a; 
a = b; 

如上代码中:将a赋值给b的时候,编译会通过,因为a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值。

将b赋值给a的时候,编译失败,因为long的范围比int范围大,会有数据丢失,不安全。

1.1.2 float 与 double 之间

float f = 3.14F;
double d = 5.12;
d = f; 
f = d; 

如上代码中:同理在将 f 赋值给 d 的时候,编译器会将 f 转换为double类型,然后进行赋值。

将 d 赋值给 f 的时候,编译不能通过,double表示数据范围大,直接将float交给double会有数据丢失,不安全。

1.1.3 int 与 byte 之间

byte b1 = 100;
byte b2 = 257;

我们在写代码的时候,写出来的整数,编译器默认都是int类型。

如上代码中, 第一行编译通过,虽然100默认是int类型,但是100没有超过byte的范围,编译器隐式将100转换为byte。

第二行编译失败,257超过了byte的数据范围(-128,127),有数据丢失。

1.2 强制类型转换(显示)

 强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。                  特点:数据范围大的到数据范围小的。但是可能会造数据丢失。

1.2.1 int 与 long 之间 

int a = 10;
long b = 100L;
a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败

如上代码中:我们将长整型变量b赋值给a的时候,需要进行强制类型转换,否则会编译失败

格式:a = (int)b;

1.2.2 float 与 double 之间 

float f = 3.14F;
double d = 5.12;
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败

在将double类型变量b赋值给float类型变量时,数据由大到小,所以也需要强制类型转换

格式:f = (float)d;

1.2.3 int 与 double 之间

int a = 10;
double d = 5.12;
a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃

如上代码中,如果直接将double型变量d赋值给整型和变量a编译不会通过,因为类型不兼容,不是属于同一类基本数据类型。所以也需要进行强制类型转换,但是转换之后,小数点之后全部丢弃。

1.2.4 int 与 byte 之间

byte b1 = 100;
byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错

如上代码中,第一行代码中,100默认为int,但是没有超过byte的范围,所以编译器会自动隐式转换,在第二行代码中,257超过了byte的范围,所以需要进行强制类型转换,否则就会报错,但是这里强转之后数据会丢失。

boolean flag = true;
a = flag; // 编译失败:类型不兼容
flag = a; // 编译失败:类型不兼容

如上代码中,编译也是不会通过的,因为a和flag是两个不相干的类型,完全一点管理,所以不能进行赋值,也不能进行强转类型不兼容。

注意:

①不同数字类型的变量之间赋值 , 表示范围更小的类型能隐式转换成范围较大的类型
②  如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能精度丢失
③  将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查
④  强制类型转换不一定能成功,不相干的类型不能互相转换

二、类型提升

类型提升:不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的

2.1 int 与 long 之间

int 会被提升为 long
int a = 10;
long b = 20;
int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据
long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long

如上代码,第三行会编译出错,因为int型和long型进行运算的时候,int型会被类型提升为long型,再与然后在进行运算,最后结果为long型,所以将long型赋值给int型c的时候会丢失数据。

2.2 byte 与 byte 之间

byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);

如上代码,编译也会出错,因为所有小于四个字节的数据类型,在运算的时候会被提升为int类型在进行运算,所以a+b的结果为int型。

正确写法:

byte a = 10 ;
byte b = 20 ;
byte c = ( byte )( a + b );

结论:

byte byte 都是相同类型 , 但是出现编译报错 . 原因是 , 虽然 a b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算 , 得到的结果也是 int, 这是赋给 c, 就会出现上述错误 .
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据 . 为了硬件上实现方便 , 诸如 byte short 这种低于 4 个字节的类型 , 会先提升成 int, 再参与计算。
好啦,到这里,今天为大家分享类型转换和类型提升已经分享完了。如果觉得小编写的可以的,可以给小编一键三连,和小编一起学习和进步,你的关注是对小编最大的鼓励。有什么相关的问题欢迎到评论区留言。谢谢大家!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云安全之访问控制的常见攻击及防御

访问控制攻击概述 访问控制漏洞即应用程序允许攻击者执行或者访问某种攻击者不具备相应权限的功能或资源。 常见的访问控制可以分为垂直访问控制、水平访问控制及多阶段访问控制 (上下文相关访问控制),与其相应的访问控制漏洞为也垂直越权漏洞(普通用户可以访问或…

《Attention Is All You Need》论文笔记

下面是对《Attention Is All You Need》这篇论文的浅读。 参考文献: 李沐论文带读 HarvardNLP 《哈工大基于预训练模型的方法》 下面是对这篇论文的初步概览: 对Seq2Seq模型、Transformer的概括: 下面是蒟蒻在阅读完这篇论文后做的一…

Modelsim测试覆盖率操作说明

1、打开Project窗口界面 2、在project界面下,选中所有需要测试覆盖率的.v文件(不包括tb文件),鼠标点击右键,在Properties选项中选择Coverage选项,选择需要测试的覆盖率类型 3、重新编译所有的源文件&#x…

一看就懂系列:阿里云服务器ECS和轻量云服务器对比

阿里云服务器ECS和轻量应用服务器有什么区别?轻量和ECS优缺点对比,云服务器ECS是明星级云产品,适合企业专业级的使用场景,轻量应用服务器是在ECS的基础上推出的轻量级云服务器,适合个人开发者单机应用访问量不高的网站…

《机器人SLAM导航核心技术与实战》第1季:第6章_机器人底盘

视频讲解 【第1季】6.第6章_机器人底盘-视频讲解 【第1季】6.1.第6章_机器人底盘_底盘运动学模型-视频讲解 【第1季】6.2.第6章_机器人底盘_底盘性能指标-视频讲解 【第1季】6.3.第6章_机器人底盘_典型机器人底盘搭建-视频讲解 第1季:第6章_机器人底盘 先 导 课…

Endnote 20 修改参考文献(References)的期刊全称为缩写

一、准备(下载)所需要的期刊缩写列表 (Term Lists) 我已经下载并上传了一份Trem Lists 链接: 在不列颠哥伦比亚大学图书馆网站导出所有期刊名和缩写,大概1W的期刊名字,期刊名字和缩写截至2021.12.03 哥伦…

Adobe_InDesign_2023_18.4.0.056图文安装教程及下载

Adobe InDesign是Adobe公司的一个桌面出版 (DTP)应用程序,简称“Id”,主要用于各种印刷品的排版编辑。InDesign是一款功能强大的出版物创作、排版和打印软件,可以帮助出版物和广告创作者提高效率,节省时间,改善印刷质量。InDesign…

大模型部署手记(2)baichuan2+Windows GPU

1.简介 组织机构:百川智能(前搜狗CEO王小川创立) 代码仓:GitHub - baichuan-inc/Baichuan2: A series of large language models developed by Baichuan Intelligent Technology 模型:baichuan-inc/Baichuan2-7B-Ch…

JavaScript Web APIs第一天笔记

复习: splice() 方法用于添加或删除数组中的元素。 **注意:**这种方法会改变原始数组。 删除数组: splice(起始位置, 删除的个数) 比如:1 let arr [red, green, blue] arr.splice(1,1) // 删除green元素 consol…

MyBatisCodeHelper Pro3.x新版本插件自由

1效果图 我的版本为3.2.2 2.资源链接 码云地址点这里 3.使用说明 将我修改好后的MyBatisCodeHelper-Pro-obfuss.jar替换MybatisCodeHelperNew-3.x.x.zip(原版本插件)\MyBatisCodeHelper-Pro\lib中的MyBatisCodeHelper-Pro-obfuss.jar 4.实现与感谢…

MySQL5.7版本与8.0版本在Ubuntu(WSL环境)系统安装

目录 前提条件 1. MySQL5.7版本在Ubuntu(WSL环境)系统安装 1. 1 下载apt仓库文件 1.2 配置apt仓库 1.3 更新apt仓库的信息 1.4 检查是否成功配置MySQL5.7的仓库 5. 安装MySQL5.7 1.6 启动MySQL 1.7 对MySQL进行初始化 1.7.1 输入密码 …

长剖与贪心+树上反悔贪心:1004T4

长剖的本质是一种贪心。(启发式合并本质也是类似哈夫曼树的过程) 在此题中,首先肯定变直径,然后选端点为根。然后选叶子。而每个叶子为了不重复计算,可以只计算其长剖后所在链的贡献。(本题精髓&#xff0…

JAVAWeb业务层开发->普通和基于MP

普通方式业务层开发 service定义接口(主要实现逻辑层面的业务功能) serviceImpl实现该接口 注意事项: 逻辑判断的代码可以使用>号,使得返回结果为布尔类型。 小结:每一个接口写完都要写测试类去检测&#…

uni-app:canvas-绘制图形2

效果 代码 <template><view><!-- 创建了一个宽度为300像素&#xff0c;高度为200像素的canvas元素。canvas-id属性被设置为"firstCanvas"&#xff0c;可以用来在JavaScript中获取该canvas元素的上下文对象。 --><canvas style"width:200px…

分布式事务-Seata

一、理论基础 1、CAP定理 1998年&#xff0c;加州大学的计算机科学家 Eric Brewer 提出&#xff0c;分布式系统有三个指标&#xff1a; • Consistency &#xff08;一致性&#xff09; • Availability &#xff08;可用性&#xff09; • Partition tolerance &#xff08…

【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Swift SwiftUI CoreData 过滤数据 1

Xcode: Version 14.3.1 (14E300c) iOS: 16 预览&#xff1a; Code: import SwiftUI import CoreDatastruct TodosSearch: View {State private var search_title "测试"FetchRequest var todos_search: FetchedResults<Todo>init() {let request: NSFetchReq…

【LeetCode热题100】--153.寻找旋转排序数组中的最小值

153.寻找旋转排序数组中的最小值 由于该排序数组经由1到n次旋转&#xff0c;所以旋转后的数组折线图为&#xff1a; 最小值处于中间&#xff0c;同时对于最后一个元素x&#xff1a;在最小值右侧的元素&#xff0c;它们的值一定严格小于x,而在最小值左侧的元素&#xff0c;它们的…

数据结构与算法(C语言版)P8---树、二叉树、森林

【本节目标】 树概念及结构。二叉树概念及结构。二叉树常见OJ题练习。 1、树概念及结构 1.1、树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xf…

新手学习Python用哪个软件比较好?

对于新手学习Python&#xff0c;有几个常用的集成开发环境&#xff08;IDE&#xff09;可以选择。以下是一些受欢迎的选择&#xff0c;可供题主参考下载使用。 集成开发环境&#xff08;IDE&#xff09; 1. PyCharm&#xff1a; PyCharm 是一款功能强大的 Python IDE&#x…