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.mzph.cn/news/94878.shtml

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

相关文章

Docker01基础操作

目录 1、docker 发展历史 2、Docker 概述 2.1 容器 2.2 Docker与虚拟机的区别 2.3 容器在内核中支持2种重要技术 2.4 namespace的六项隔离 2.5 Docker核心概念 2.6 安装 Docker 2.7 Docker 镜像操作 2.8 Docker 容器操作 2.9 面试题 1、docker 发展历史 https://www.…

IO学习系列之使用多进程复制同一个文件内容

实例要求:使用多进程复制同一个文件内容;实例分析:1.创建一个父进程和一个子进程,设置光标在指定文件中的偏移量,实现对同一个文件的复制。2.比如:可以指定子进程复制文件内容的前一半,而父进程…

nvm 管理 node版本

下载地址 https://nvm.uihtm.com/download.html 基础命令 查看所有可安装的node版本 nvm list available 查看本地已经安装的所有版本: nvm list 安装指定的node版本 nvm install 14.18.1 使用指定node版本 nvm use 14.18.1 卸载指定node版本 nvm uninstall …

【网络编程】UDP数据报套接字编程和TCP流套接字编程

文章目录 1. 网络编程基础1.1 为什么需要网络编程?1.2 网络编程是什么?1.3 概念 2. Socket套接字3. UDP数据报套接字编程3.1 DatagramSocket API3.2 DatagramPacket API3.3 InetSocketAddress API 4. UDP构建服务端客户端(一发一收&#xff0…

【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时

第十章,评估(下)-当不存在一个简单的正确答案时 在上一章中,了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出,我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。 然而,如果 LLM …

文本分词排序

文本分词 在这个代码的基础上 把英语单词作为一类汉语,作为一类然后列出选项 1. 大小排序 2. 小大排序 3. 不排序打印保存代码 import jieba# 输入文本,让我陪你聊天吧~ lines [] print("请输入多行文本,以\"2333.3\"结束&am…

osg实现鼠标框选

目录 1. 需求的提出 2. 具体实现 2.1. 禁止场景跟随鼠标转动 2.2. 矩形框前置绘制 3. 附加说明 3.1. 颜色设置说明 3.2.矩形框显示和隐藏的另一种实现 1. 需求的提出 有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键,拖出一个矩形,实现框…

ValueError: check_hostname requires server_hostname

使用jupyter 下载js2py 异常 !pip install js2py ValueError: check_hostname requires server_hostname 一开始以为是数据源问题,切换阿里云 还是这个异常 结果发现是开魔法导致的,关闭魔法即可

Redisson集群管理工具、对Redis节点的操作

一、集群管理工具 Redisson集群管理工具提供了通过程序化的方式,像redis-trib.rb脚本一样方便地管理Redis集群的工具。 1、 创建集群 以下范例展示了如何创建三主三从的Redis集群。 ClusterNodes clusterNodes ClusterNodes.create() .master("127.0.0.1:…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一:贪心算法 方法二:动态规划 方法三:回溯算法 方法四:并查集 第二题 题目来源 题目内容 解决方法 方法一:排序和遍历 方法二:扫描线算法 方法…

【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类

第三章 评估输入-分类 在本章中,我们将重点讨论评估输入任务,这对于确保系统的质量和安全性至关重要。 对于需要处理不同情况下的许多独立指令集的任务,首先对查询类型进行分类,并以此为基础确定要使用哪些指令,具有…

英伟达NVIDIA驱动安装

一般,我们新的显卡上机或者新系统可能就需要重新安装显卡驱动。或者是我们在配置深度学习环境时候,需要手动安装驱动。 官网地址:官方高级驱动搜索 | NVIDIA 我们选择好自己需要的驱动后直接安装即可 下载的时候,选择自己需要的驱…

计算机竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习?5.1.2 为什么要迁移学习? 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

第一篇:数组定义JavaScript

数组的定义 数组是一种特殊的变量,能够用来一次存放一个以上的值。 一维数组的定义 //使用字面量[]方式定义 var arr [1,2,3] console.log(arr)//1,2,3使用构造函数的方式定义 var arr new Array()//定义了一个空数组 var arr new Array(10)//定义了长度为1…

微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

1. 服务路由 1.1. Zuul 接收请求: 在routes路由规则中,根据path去匹配,如果匹配中,就使用对应的路由规则进行请求转发如果无法从routes中匹配,则根据path用“/”去截取第一段作为服务名进行请求转发,转发…

spring-boot 操作 mongodb 数据库

如何使用 spring-boot 操作 mongodb 数据库 配置文件&#xff1a; spring:data:mongodb:host: 127.0.0.1database: fly_articleDbport: 27017# 可以采取 mysql 写法# uri: mongodb://127.0.0.1/fly_articleDb依赖信息: <?xml version"1.0" encoding"UTF-…

JavaSE | 初识Java(一) | JDK \ JRE \ JVM

Java初识 Java 是一门半编译型、半解释型语言。先通过 javac 编译程序把源文件进行编译&#xff0c;编译后生成的 .class 文件是由字节 码组成的平台无关、面向 JVM 的文件。最后启动 java 虚拟机 来运行 .class 文件&#xff0c;此时 JVM 会将字节码转换成平台能够理…

线程的概述

#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能&#xff1a;创建一个子线程 参数&#xff1a; -thread:传出参数&#xff0c;线程创建成功后&#xff0c;子线程的ID被写到…

1092:求出e的值

#include <iostream> using namespace std;int main() {//1.定义变量double e 1.0f;double factorial 1.0f;int n 0;//2.输入数据cin >> n;for(int i 1; i < n; i){factorial factorial * i;e 1.0 / factorial;}printf("%.10lf",e);return 0; }…

日常工作报告生成器微信小程序源码 支持日报,周报,月报,年终终结

相信大家上班都会有做工作报告的情况吧 那么这款小程序就是大家的福音了 只要输入你的工作内容或者岗位自动生成你的工作报告 支持报,周报,月报,年终终结 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391810 源码下载2&#xff1a;评论留言或私信…