Java中的类型转换 Day4

news2024/9/21 14:33:19

类型转换

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

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开始

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

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

相关文章

debug对于开发工程师很重要

在日常开发中,总会遇到一些出人意料的bug,程序跑飞,上电就挂,程序没有按预期执行诸如此类的问题,没有好的调试方法,真的很难定位问题,更别说解决了。在这里分享我用过的一些调试方法&#xff0c…

欧几里得算法求最大公约数

两个不全为0的非负整数m,n的最大公约数记为gcd(m,n),代表能够整除(即余数为0)m和n的最大正整数。 计算gcd(m,n)的欧几里得算法: 第一步&#xf…

初识爬虫2

requests学习(未更新完): 小技巧,如果你用的也是pycharm,对于控制台输出页面因为数据很长一行,不方便进行查看, 可以让它自动换行: 1.requests文档阅读学习链接:快速上…

linux 脱机

先安装 screen apt-get install screen

【网络】网络通信的传输方式

目录 1.网络通信中的两种基本通信模式 1.1.怎么理解连接 1.2.面向有连接类型 1.3.面向无连接类型 2.实现这两种通信模式的具体交换技术 2.1.电路交换 2.2.分组交换 3.根据接收端数量分类 单播(Unicast) 广播(Broadcast) …

8、值、指针、引用作为参数或返回值

一、作为参数 1、值传递 #include <iostream> using namespace std;void swap(int a, int b) {cout << __FUNCTION__ << "交换前a:" << a << " b:" << b << endl;int tmp a;a b;b tmp;cout << __FUN…

98.游戏的启动与多开-分析与实现多开器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;97.游戏的启动与多开-共享内存多开检测 以 97.游戏的启动与多开-共享内存多开检测 它的…

若依框架开发

若依环境 介绍 ‌若依是一款快速开发平台(低代码)&#xff0c;用于快速构建企业级后台管理系统&#xff0c;它提供了许多常用的功能模块和组件&#xff0c;包括权限管理、代码生成、工作流、消息中心等 官方地址: https://www.ruoyi.vip/ ‌基于Spring Boot和Spring Cloud‌…

vscode配置C/C++环境(保姆级详细教程)

一. 引言 VSCode&#xff0c;全称为Visual Studio Code&#xff0c;是一款由微软开发的免费、开源的轻量级代码编辑器&#xff0c;它支持多种编程语言和平台&#xff0c;并提供丰富的扩展功能&#xff0c;让开发者能够更高效地编写代码。 大家能来搜用如何在VSCode配置C/C环境…

Linxu系统:kill命令

1、命令详解&#xff1a; kill命令是用于向进程发送信号&#xff0c;通常用来终止某个指定PID服务进程&#xff0c;kill命令可以发送不同的信号给目标进程&#xff0c;来实现不同的操作&#xff0c;如果不指定信号&#xff0c;默认会发送 TERM 信号&#xff08;15&#xff09;&…

1. 初识LLM API:环境配置与多轮对话演示

其实AI应用并不是一个什么很高大上的东西&#xff0c;你可以将它当作一个文字的“调库”行为&#xff0c;“调库”只需要知道库名就行了&#xff0c;这里实际也是如此。甚至你只需要知道你想问什么&#xff0c;将你的消息作为输入&#xff0c;就能从大模型得到输出。而这个“库…

CSS学习17--CSS3 过渡、2D变形、3D变形、动画

CSS3 过渡、2D变形、3D变形、动画 一、过渡二、2D变形 transform1.移动 translate2.缩放 scale3. 旋转 rotate4. 倾斜 skew 三、3D变形1. rotateX&#xff08;&#xff09;rotateY&#xff08;&#xff09; rotateZ&#xff08;&#xff09;2. 体会透视 perspective3. translat…

直播电商系统卷轴模式源码开发的发展前景

随着互联网技术的飞速发展和直播电商的日益兴起&#xff0c;直播电商系统已成为数字经济的重要组成部分。其中&#xff0c;卷轴模式作为一种结合了积分奖励和任务兑换机制的商业模式&#xff0c;正逐渐在直播电商领域崭露头角&#xff0c;并展现出广阔的发展前景。本文将从卷轴…

【腾讯云】AI驱动的数据库TDSQL-C如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图

欢迎来到《小5讲堂》 这是《腾讯云》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景效果图流程图创建数据库基本信息数据库配置设置密码控制台开启…

学工控必须知道的变频器字母符号

#变频器##变频器故障##伺服电机##电工##电工#工控人加入PLC工业自动化精英社群 工控人加入PLC工业自动化精英社群

windows软件应该安装在哪里

100%原创动力 文章目录 前言一、安装路径二、数据文件夹1.用户文件夹2.AppData 三、为什么需要管理员权限四、绿色软件 前言 windows软件应该安装在哪里 一、安装路径 windows系统安装软件应该安装在哪里&#xff0c;根据windows规范应该安装在某个盘的 Program Files 目录…

ICP备案办理的流程中股东附件不显示如何解决

ICP备案办理的流程中股东附件不显示如何解决 问题解决方案注意吐槽 问题 问题弹窗&#xff1a; 部分一级股东没有上传证照附件,请检查并上传。 问题内容&#xff1a; 在【股东追溯及其相关证明材料】这一页中无法保存&#xff0c;提示要上传证照附件&#xff0c;但这边找不到任…

dwg2text抽取dwg文件文字不完整分析

libdxfrw项目中dxf2text命令可以抽取dwg文件中的文字部分&#xff0c;编译完工程后对手头上的dwg文件提取时发现抽取不完整&#xff0c;对源码进行分析时发现该命令只处理了text部分&#xff0c;不处理mtext部分 bool dx_iface::printText(const std::string& fileI, dx_da…

Cross-Encoder实现文本匹配(重排序模型)

引言 前面几篇文章都是基于表示型的方法训练BERT进行文本匹配&#xff0c;而本文是以交互型的方法。具体来说&#xff0c;将待匹配的两个句子拼接成一个输入喂给BERT模型&#xff0c;最后让其输出一个相似性得分。 文本匹配系列文章先更新到此&#xff0c;目前为止都是基于监督…

AI大模型行业专题报告:大模型发展迈入爆发期,开启AI新纪元

大规模语言模型&#xff08;Large Language Models&#xff0c;LLM&#xff09;泛指具有超大规模参数或者经过超大规模数据训练所得到的语言模型。与传统语言模型相比&#xff0c;大语言模型的构建过程涉及到更为复杂的训练方法&#xff0c;进而展现出了强大的自然语言理解能力…