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

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
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 数据基本类型的更多相关文章
- Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
- Java多线程系列 基础篇02 线程的创建和运行
1.线程创建的方式常用有两种 1. 继承 Thread 类创建线程 2. 实现 Runnable 接口创建线程 2.Thread 和 Runnable的区别 Thread和Runnable的相同点:都 ...
- Java多线程系列--“基础篇”11之 生产消费者问题
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- Java多线程系列--“基础篇”03之 Thread中start()和run()的区别
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Java多线程系列--“基础篇”08之 join()
概要 本章,会对Thread中join()方法进行介绍.涉及到的内容包括:1. join()介绍2. join()源码分析(基于JDK1.7.0_40)3. join()示例 转载请注明出处:http ...
- Java多线程系列--“基础篇”09之 interrupt()和线程终止方式
概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于“阻塞状态”的线程2.2 终止处于“运行状态” ...
随机推荐
- 使用 KubeSphere 部署高可用 RocketMQ 集群
作者:老Z,云原生爱好者,目前专注于云原生运维,KubeSphere Ambassador. Spring Cloud Alibaba 全家桶之 RocketMQ 是一款典型的分布式架构下的消息中间件 ...
- RocketMQ Streams拓扑构建与数据处理过程
本文作者:倪泽,Apache RocketMQ committer.RSQLDB/RocketMQ Streams Maintainer 01 背景 RocketMQ Streams 1.1.0版本已 ...
- jetpack1
组合函数 package com.example.myapplication1 import android.os.Bundle import androidx.activity.ComponentA ...
- 关于如何更改Cuda的版本的一些事情
1. 网上说的很全面了,这里我把我遇到的一些问题和解决方案罗列出来,以便未来的学习和了解. 博客的好处就体现出来了,下次你再用这个东西,就直接打开你的博客照抄就行了,不用东搜西搜了,及其方便,这种碎片 ...
- openresty操作mongodb
最近项目中使用openresty,需要通过openresty连接mongo,经过几番折腾终于有了一个结果,现将其记录下来,也感谢模块提供者 使用openresty操作mongo 1.引入第三方的模块 ...
- luckysheet 初始化数据 以及 sheet显示数据
主要说明属性 表格初始化时使用一维数组格式的 celldata,初始化完成后转化为二维数组格式的data作为存储更新使用,celldata不再使用. 如果需要将data拿出来作为初始化数据,则需要执行 ...
- OSG开发笔记(三十二):深入理解相机视口、制作支持与主视图同步变换旋转的相机HUD
前言 深入理解相机视口,摸索相机视口旋转功能,背景透明或者不透明. 本篇,实现了一个左下角旋转HUD且背景透明的相机视口. Demo HUD相机的坐标 ...
- vue $forceUpdate()强制刷新
改变列表的值 一直不渲染 <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> ...
- Java里快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- B+树原理详解
B树 与 B+树 我们今天要介绍的是工作开发中最常接触到的 InnoDB 存储引擎中的 B+ 树索引.要介绍 B+ 树索引,就不得不提二叉查找树,平衡二叉树和 B 树这三种数据结构.B+ 树就是从他们 ...