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; 会得到如下清晰的提示

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; 会得到如下清晰的提示

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

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 数据基本类型的更多相关文章

  1. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

  2. Java多线程系列 基础篇02 线程的创建和运行

    1.线程创建的方式常用有两种 1. 继承 Thread 类创建线程 2. 实现 Runnable 接口创建线程 2.Thread 和 Runnable的区别 Thread和Runnable的相同点:都 ...

  3. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  4. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  5. Java多线程系列--“基础篇”03之 Thread中start()和run()的区别

    概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...

  6. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  7. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

  8. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  9. Java多线程系列--“基础篇”08之 join()

    概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...

  10. Java多线程系列--“基础篇”09之 interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...

随机推荐

  1. Nuxt.js 应用中的 vite:extend 事件钩子详解

    title: Nuxt.js 应用中的 vite:extend 事件钩子详解 date: 2024/11/11 updated: 2024/11/11 author: cmdragon excerpt ...

  2. linux系统查看日志方法

    linux查看日志可以使用tail.cat.less.grep等实现,linux系统的日志通常是存在/var/log中 1.使用cat命令:cat /var/log,log目录下还有多种类型的日志文件 ...

  3. CommonsCollections3(基于ysoserial)

    环境准备 JDK1.7(7u80).commons-collections(3.x 4.x均可这里使用3.2版本).javassist(3.12.1.GA) JDK:https://repo.huaw ...

  4. 基于antlr的表达式解析器——函数类型验证

    package daicy.formula.evaluator; import java.util.HashMap; import java.util.Map; import org.antlr.ru ...

  5. JS之Date时间处理

    初始化当前时间: // 1. 使用构造函数方式 var newDate = new Date() // 2. 使用函数方式 var date = Date() // 返回的是一个Date对象 cons ...

  6. vue之项目部署

    一.将vue项目打包同步文件到远程服务器 1. 打包 默认情况下,使用vue-cli创建的项目,package.json里的script应该已经配置了build指令,直接执行yarn build 或者 ...

  7. Htq-基于Node.js的异步队列

    github: https://github.com/star7th/htq 部分介绍: 先介绍下基本概念. 我们在编写程序时,偶尔会遇到需要用到异步队列的情况.比如说,我发送一万封邮件,如果单纯使用 ...

  8. 支付宝支付功能接入(PC)

    在使用支付宝支付功能开发的阶段, 可以在沙箱环境下进行开发, 开发完成之后, 到线上再进行相关参数的替换即可 一. 登陆支付宝开放平台(https://open.alipay.com/platform ...

  9. uniapp 样式篇

    1.全局变量 项目根目录的 uni.scss 文件是uni-app内置的常用样式变量,这个文件会自动引入,开发者可直接引用这个变了 文件默认已经定义了常用的变量,开发者也可以在此基础上继续添加 /* ...

  10. Vue3 组合式API

    1.入口 创建实例时,配置setup方法,然后其内部书写组合式API代码,通过组合式API生产的数据和返回,需要暴漏出去才能给HTML使用 <script> //组合式(解构赋值) con ...