当前位置: 首页 > news >正文

Java中的类型转换 Day4

类型转换

类型转换总结来说就是:自动提升 手动下降

3.1 自动类型转换

自动类型转换需要满足的要求

  • 两种类型相互兼容
    • 例:int类型的取值范围包含了short类型的取值范围
  • 目标类型大于源类型
    • 目标类型的取值范围(等号左边)大于源类型(等号右边)的取值范围

代码举例

public class ConvertTest {public static void main(String[] args) {byte b1 = 100;short s1 = b1;int i1 = b1;long l1 = b1;float f1 = b1;double d1 = b1;System.out.println("b1 = " + b1);System.out.println("s1 = " + s1);System.out.println("i1 = " + i1);System.out.println("l1 = " + l1);System.out.println("f1 = " + f1);System.out.println("d1 = " + d1);}
}
  • 此代码证明了,不一定相邻之间的类型才能兼容,只要目标类型的范围包含了源类型的范围即可,

  • char类型的自动转换,因为char也可以存储整数,所以也可以与兼容的数据类型进行转换

    public class ConvertTest {public static void main(String[] args) {char c1 = 'L';int i1 = c1;long l1 = c1;float f1 = c1;double d1 = c1;System.out.println("c1 = " + c1);System.out.println("i1 = " + i1);System.out.println("l1 = " + l1);System.out.println("f1 = " + f1);System.out.println("d1 = " + d1);}
    }
    
    • short类型无法跟char类型进行自动类型转换,即使他们的字节数相同,但是short的取值范围是-3276832767,而char的取值范围是065535,他们的类型产生了冲突
    • 运行结果
      在这里插入图片描述

3.2 自动类型提升规则

圣经:

  • 两个操作数有一个为double,计算结果提升为double。
  • 如果操作数中没有double,有一个为float,计算结果提升为float。
  • 如果操作数中没有float,有一个为long,计算结果提升为long。
  • 如果操作数中没有long,有一个为int,计算结果提升为int。
  • 如果操作数中没有int,均为short或byte或者char,计算结果提升为int。
  • 特殊:任何类型与String相加(+)时,实为拼接,其结果为String。

当多个操作数进行数值运算时,往往都是提升为操作数中取值范围最大的类型

3.2 强制类型转换

强制类型转换需要满足两个要求

  • 两种类型要相互兼容
    • 数值与数值之间相互兼容
  • 目标类型小于源类型
    • 目标类型的取值范围(等号左边)小于源类型(等号右边)的取值范围

代码举例

public class ConvertTest {public static void main(String[] args) {short s1 = 123;byte b1 = (byte)s1;System.out.println("s1 = " + s1);int i1 = 12345;short s2 = (short) i1;System.out.println("s2 = " + s2);float f1 = 3.9F;long l1 = (long) f1;System.out.println("l1 = " + l1);double d1 = 48.2;char c1 = (char)d1;System.out.println("c1 = " + c1);}
}

运行结果
在这里插入图片描述

  • 可以看到在此串代码中,l1经过强制类型转换后,不是四舍五入,而是直接截断 取3

    float f1 = 3.9F;
    long l1 = (long) f1;
    System.out.println("l1 = " + l1);
    

3.3 特殊情况下的强制类型转换

超出目标类型的数值进行强制类型转换,是特殊的强制类型转换

代码举例

public class ConvertTest {public static void main(String[] args) {short s1 = 257;byte b1 =(byte)s1;System.out.println("s1 = " + s1);System.out.println("b1 = " + b1);}
}

运行结果
在这里插入图片描述

为什么强制类型转换之后是1呢?这个就是涉及到二进制的概念了,二进制分为原码、反码和补码,而计算机通常都是以补码的形式来存放整数的

  • 正数的原码、反码、补码都一样
  • 负数要经过一系列的操作把他转换成补码

接下来我们来解析一下代码

我们知道short占2个字节,即16个位,用二进制存放如下
在这里插入图片描述

byte占1个字节,即8个位,如下
在这里插入图片描述

因为byte只有8位,short有16位,所以只能把低位8位存的下去,高位的存不下全部截断

在这里插入图片描述

最终得到1
在这里插入图片描述

再来看一个代码

package com.csdn.code.day3;public class ConvertTest {public static void main(String[] args) {short s1 = 128;byte b1 =(byte)s1;System.out.println("s1 = " + s1);System.out.println("b1 = " + b1);}
}

先看看计算机是怎么存放的
在这里插入图片描述

那么结果是什么呢
在这里插入图片描述

可以看到,变成-128了,那是因为在二进制中,最高位是符号位,其他位都是数值位,如图中,红色部分都是符号位,那么为什么是-128呢

  • 首先排除一个问题,最高位就是符号位,其他位就是数值位,按照正常来说应该是-0,但事实上,0既不是正数也不是负数,所以也不可能是-0,那么-128是怎么来的呢?

  • 在8位的二进制中,最高能容纳127的数值,那么我们要-127-1,是不是能得到-128,那么我们前面说过,负数需要经过一系列的操作才能把它转换补码,现在就用-127来转换一下

    • 写出-127的原码:
      在这里插入图片描述

    • 求出-127的反码:(原码的符号位不变,数值位按位取反)
      在这里插入图片描述

    • 求出-127的补码:(反码+1=补码)
      在这里插入图片描述

    • -127-1=-128
      在这里插入图片描述

      • 对吧图上的存放图,可以发现是一模一样的,所以我们通过求解知道了这个就是-128
  • 二进制补充
    在这里插入图片描述

    • 对于我们这个二进制计算,他是有范围的,他的范围就是一个字节,这一个字节最大就是127,如果你+1了,就存不下了,所以在+1时,他就会变成-128,也就是一个字节中最小的一位,类似于时钟一样,一圈就12小时,过了12点之后,下一点又是从1开始

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue+SpringBoot+数据库整体开发流程 2
  • uniapp 懒加载、预加载、缓存机制深度解析
  • 动手学深度学习(pytorch)学习记录27-深度卷积神经网络(AlexNet)[学习记录]
  • 农业小气候观测站
  • 【python】 @property属性详解 and mysql的sqlalchemy的原生sql
  • PIN AI获得a16z CSX、Hack VC和全明星天使的1000万美元融资,推出个人AI开放平台
  • HarmonyOS开发之Swiper的使用(跳转到指定索引的方法)
  • 【百日算法计划】:每日一题,见证成长(011)
  • 第二章:表操作
  • 从生成器函数Generator出发,聊聊Async await
  • 多线程相关面试题
  • 免费扫描试卷的软件有哪些?5个软件帮助你轻松进行试卷扫描
  • GO HTTP库使用
  • Jmeter_循环获取请求接口的字段,并写入文件
  • golang学习笔记11——Go 语言的并发与同步实现详解
  • ----------
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Java面向对象及其三大特征
  • jquery ajax学习笔记
  • js算法-归并排序(merge_sort)
  • Just for fun——迅速写完快速排序
  • Markdown 语法简单说明
  • php的插入排序,通过双层for循环
  • Redux 中间件分析
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vuex 学习笔记 01
  • 欢迎参加第二届中国游戏开发者大会
  • 回流、重绘及其优化
  • 记一次删除Git记录中的大文件的过程
  • 如何使用 JavaScript 解析 URL
  • 使用docker-compose进行多节点部署
  • 小试R空间处理新库sf
  • 智能合约开发环境搭建及Hello World合约
  • ionic异常记录
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (翻译)terry crowley: 写给程序员
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 设计模式初探
  • .net和jar包windows服务部署
  • .NET开发者必备的11款免费工具
  • .net中生成excel后调整宽度
  • @ComponentScan比较
  • [ Linux ] Linux信号概述 信号的产生
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析