首页 > 基础资料 博客日记
【Java 温故而知新系列】基础知识-02 数据基本类型
2024-12-29 23:18:57基础资料围观58次
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、运算
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);
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 类型时,会得到如下清晰的提示
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: