【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 终止处于“运行状态” ...
随机推荐
- C语言之输入输出
标准库 IO 输入输出功能并非C语言的组成部分,ANSI标准定义了相关的库函数 输入输出 <stdio.h> 流stream是与设备关联的数据的源或者目的地. 文本流:由文本行组成的序列 ...
- ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车
ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车 小车源代码 注意修改WIFI 信息 #include <analogWrite.h> #include <WiFi. ...
- DFS序求LCA
DFS序求LCA 介绍 欧拉序求LCA 的数组总是会忘记开两倍,并且预处理的常数较大.用 DFS序求LCA 可以解决这些问题. 欧拉序:进节点和出节点会重复记录节点. DFS序:深度优先搜索的顺序,不 ...
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
二.Spring Security默认认证流程及其优缺点 1.Spring Security默认认证流程总结 四.Spring Boot集成Spring Security之认证流程详细介绍了认证流程, ...
- 一款WPF开发的B站视频下载开源项目
更多开源项目请查看:一个专注推荐优秀.Net开源项目的榜单 今天给推荐一款C#开发的.界面简洁的哔哩哔哩视频下载工具. 项目简介 这是一款基于WPF开发的,B站下载工具,操作界面简洁,支持多线程下载. ...
- 题解:CF718A Efim and Strange Grade
CF718A Efim and Strange Grade 题解 算法 贪心+模拟 思路分析 显然,要最优每一次进位就只能五入不能四舍.而且当我们五入时,要取位数最高的.比如说 \(1.3535\), ...
- 如何手写实现 JSON Parser
JSON.parse 是我们在前端开发中经常会用到API,如果我们要自己实现一个JSON.parse,我们应该怎么实现呢?今天我们就试着手写一个JSON Parser,了解下其内部实现原理. JSON ...
- 干货分享:Air700ECQ的硬件设计,第三部分
5. 电器特性,可靠性,射频特性 5.1. 绝对最大值 下表所示是模块数字.模拟管脚的电源供电电压电流最大耐受值. 表格 17:绝对最大值 参数 最小 最大 单位 VBAT -0.3 4.7 V ...
- P3920 WC2014 紫荆花之恋
P3920 WC2014 紫荆花之恋 毒瘤题目,动态点分树. 前置科技点 替罪羊树 高速平衡树(除去 fhq_treap 和 splay 之外的所有平衡树) 约定 \(dis(u,v)\) 为原树上 ...
- CommonsCollections7(基于ysoserial)
环境准备 JDK1.8(8u421)我以本地的JDK8版本为准.commons-collections(3.x 4.x均可这里使用3.2版本) cc3.2: <dependency> &l ...