【Java 温故而知新系列】基础知识-02 数据基本类型

1、Java基本数据类型

Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。

基本数据类型

  • 数值型:整数类型(byte,short,int,long) ;浮点类型(float,double)
  • 字符型:char
  • 布尔型:boolean
类型 类型名称 关键字 占用内存 取值范围 默认值
整型 字节型 byte 1 Byte(字节) -128(2^7) ~ 127(2^7-1) 0
短整型 short 2 Byte(字节) -32768(2^15) ~ 32767(2^15-1) 0
整型 int 4 Byte(字节) -2147483648(2^31) ~ 2147483647(2^31-1) 0
长整型 long 8 Byte(字节) -2^63 ~2^63-1 0L
浮点型 单精度浮点型 float 4 Byte(字节) -3.4028235 × 10^38 ~ 3.4028235×10^38 0.0F
双精度浮点型 double 8 Byte(字节) −1.7976931348623157×10^308 ~ 1.7976931348623157×10^308 0.0D
字符型 字符型 char 2 Byte(字节) 表示一个字符,如'a'、'A' 'u0000'
布尔型 布尔型 boolean 1 Byte(字节) true、false false

很长一段时间里对整型数据的取值范围我自己一直几个疑问 ,以byte 举例:byte的取值范围是 -128 (2^7)~ 127(2^7-1):

1、那么byte的内存是 1 字节刚好是8位,它的取值范围为什么是2^7而不是2^8呢 ???

2、最小值是-2^7,为什么最大值是2^7-1而不是 2^7呢 ???

有没有跟我一样的小伙伴 ? O(∩_∩)O哈哈~ 咋们接着往下看,看我细细道来!!!

疑问1:

因为 byte 是有符号整型,需要表示正数、负数以及零,所以需要用一位来表示符号,最高位被用作符号位,所以最终表示数字范围只能是2^7 而不是2^8。

  • 如果最高位(最左边的一位)是0,则该数为正数或零。
  • 如果最高位是1,则该数为负数。

个人觉得第一个疑问还是比较好理解的,有符号位嘛,占一位所以少了一位。

疑问2:

最大值:最高位被用作符号位,因此当这7个位全部为1且符号位为0时得到的就是最大正值(二进制: 01111111),而二进制 01111111 转换为十进制的值就是127,所以byte最大值刚好就是 2^7-1;

最小值:对于最小的负数 -128,这是因为在二进制补码中,所有8位都是1(即 11111111)表示的是 -1。而当只有最高位为1,其余位都为0(即 10000000)时,根据二进制补码规则,这个值代表的是 -2^7 = -128。

到此我的2个疑问就都解开了, 不知道有没有解开小伙伴你们的疑问呢?反思一下有这个疑问的根本原因是没搞明白二进制的补码规则 欢迎大家进行探讨哈。

下面是网上搜罗的补码规则以及设计出补码的原因,仅供我自己和大家参考:

二进制补码规则:

1. 正数的补码
对于正数,其补码就是它自身的二进制表示。例如,十进制数 5 的8位二进制表示为 00000101,这也是它的补码表示。

2. 负数的补码
要获得一个负数的补码表示,可以按照以下步骤操作:

  • 找到对应的正数:先确定该负数绝对值的二进制表示。
  • 取反:将上述二进制数中的每一位取反(即将所有的 0 变成 1,所有的 1 变成 0),这一步也称为一的补码(One's Complement)。
  • 加1:在取反后的结果上加 1,得到的就是该负数的二进制补码表示。

3. 补码的优点

  • 简化了加法器的设计:无论是正数还是负数,都可以用同一个硬件电路来进行加法运算。
  • 消除了正零和负零的区别:在补码系统中,只有唯一的一个零(所有位均为 0),而不存在两个不同的零。
  • 自动处理溢出:当发生溢出时,只要忽略最左边的进位位,结果仍然是正确的。

2、运算

float 与 double

Java 不能隐式执行向下转型,因为这会使得精度降低。

1.1 字面量属于 double 类型,不能直接将 1.1 直接赋值给 float 变量,因为这是向下转型。

```
// float f = 1.1;
```

在代码中输入 float f = 1.1; 会得到如下清晰的提示

【Java 温故而知新系列】基础知识-02 数据基本类型

1.1f 字面量才是 float 类型。

```
1 float f = 1.1f;
```

隐式类型转换

因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型向下转型为 short 类型。对于 short s = 1; s = s + 1;由于 1 是 int 类型,因此 s+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型

```
short s = 1;
// s = s + 1;
```

在代码中输入s = s + 1; 会得到如下清晰的提示

【Java 温故而知新系列】基础知识-02 数据基本类型

但是使用 += 或者 ++ 运算符会执行隐式类型转换。

```
1 s += 1;
2 s++;
```

上面的语句相当于将 s + 1 的计算结果进行了向下转型:

```
1 s = (short) (s + 1);
```

switch

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版 本中都是不可以的

```
1 String temp = "a";
2 switch (temp) {
3     case "a":
4         System.out.println("aaa");
5         break;
6     case "b":
7         System.out.println("bbb");
8         break;
9 }
```

switch 不支持 long、float、double,是因为 switch 的设计初衷是对那些只有少数几个值的类型进行等值判断,如果值过于复杂,那么还是用 if 比较合适。

当switch(expr) 中的expr 是long 类型时,会得到如下清晰的提示

【Java 温故而知新系列】基础知识-02 数据基本类型

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/4777.html

(0)
LomuLomu
上一篇 2024 年 12 月 28 日 下午6:05
下一篇 2024 年 12 月 28 日

相关推荐

  • (Java)jdk8下载安装与环境变量配置(手把手教程)

    目录 一.jdk8的下载 1.点击我的阿里云盘链接进行下载jdk8u231 2.官网下载jdk8(比较繁琐,可以直接去我的云盘下载) 以下为官网下载方式: (1.)第一步:点击下载链接,点击以后会来到这个页面 (2).第二步:往下滑,找到如图所示的jdk8 (3.)第三步:点击Java SE 8 (8u211 and later),来到这个页面直接下 滑 (…

    2025 年 1 月 21 日
    68300
  • Mysql

    MySQL 学习整理 MySQL 基础架构 最上层的客户端所包含的服务并不是 MySQL 独有的,大多数基于网络的客户端/服务器工具或服务器都有类似的服务,包括连接处理、身份验证、确保安全性等。 第二层包含了大多数 MySQL 的核心功能,包括查询解析、分析、优化、以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能也都在这一层实现:…

    2025 年 1 月 6 日
    41400
  • 万字图文:SaaS业务架构、价值流、业务能力、业务流程、业务对象、组织架构

    大家好,我是汤师爷~ 本文为读者提供一个SaaS业务架构的系统性框架,探讨业务架构分析的核心要素,帮助SaaS企业深入剖析目标客户的业务模式,全面理解他们的业务架构。 无论你是SaaS创业者、产品经理还是架构师,本文内容都将为你的系统设计和决策提供帮助。 1 目标与步骤 SaaS业务架构需要区分两种视角:SaaS企业自身的业务架构、SaaS服务客户的业务架构…

    2025 年 1 月 14 日
    42000
  • 探索Java字符串:String类的核心操作指南

    ❀❀❀ 欢迎持续关注,每日收获编程小技巧 ❀❀❀内容概览一、String类概述二、String对象的创建方式1. 直接赋值法2. 构造方法实例化三、String类高频方法解析1 字符串对比操作1.1 ==运算符的陷阱1.2 equals方法应用1.3 忽略大小写比较1.4 字典序比较方法2 字母大小写转换2.1 转大写方法2.2 转小写方法3 获取字符串长度…

    未分类 2025 年 5 月 12 日
    15900
  • 【Java多线程】如何使用Java多线程下载网络文件 断点续传

    如何使用Java多线程下载网络文件,并实现断点续传 在现代网络应用中,多线程下载是一种常见的技术,它可以显著提高下载速度并提供更好的用户体验。本篇文章将介绍如何使用Java实现多线程下载,并结合项目中的代码作为示例进行讲解。 1. 多线程下载的基本原理 多线程下载的基本思想是将一个文件分成多个部分,每个部分由一个线程独立下载,最后将这些部分合并成完整的文件。…

    未分类 2025 年 1 月 11 日
    38700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信