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

打印 上一主题 下一主题

主题 845|帖子 845|积分 2537

1、Java基本数据类型

Java语言是强类型语言,对于每一种数据都定义了明确的详细的数据类型,在内存中分配了差别巨细的内存空间。
基本数据类型

  • 数值型:整数类型(byte,short,int,long) ;浮点类型(float,double)
  • 字符型:char
  • 布尔型:boolean
 
类型类型名称关键字占用内存取值范围默认值
整型字节型byte1 Byte(字节)  -128(2^7)
~ 127(2^7-1)
0
短整型short2 Byte(字节)  -32768(2^15)
~ 32767(2^15-1)
0
整型int  4 Byte(字节)-2147483648(2^31)
~ 2147483647(2^31-1)
0
长整型long8 Byte(字节)-2^63 ~2^63-10L
浮点型单精度浮点型float4 Byte(字节)-3.4028235 × 10^38
~ 3.4028235×10^38
0.0F
双精度浮点型double8 Byte(字节)−1.7976931348623157×10^308
~ 1.7976931348623157×10^308
0.0D
字符型字符型char2 Byte(字节)表现一个字符,如'a'、'A''\u0000'
布尔型布尔型boolean1 Byte(字节)true、falsefalse
很长一段时间里对整型数据的取值范围我自己一直几个疑问 ,以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 变量,因为这是向下转型。
  1. // float f = 1.1;
复制代码
 在代码中输入 float f = 1.1; 会得到如下清晰的提示

 1.1f 字面量才是 float 类型。 
  1. 1 float f = 1.1f;
复制代码
 
 隐式类型转换

因为字面量 1 是 int 类型,它比 short 类型精度要高,因此不能隐式地将 int 类型向下转型为 short 类型。对于 short s = 1; s = s + 1;由于 1 是 int 类型,因此 s+1 运算效果也是 int型,需要逼迫转换类型才能赋值给 short 型
  1. short s = 1;
  2. // s = s + 1;
复制代码
 在代码中输入s = s + 1; 会得到如下清晰的提示

 
但是使用 += 或者 ++ 运算符会执行隐式类型转换。
  1. 1 s += 1;
  2. 2 s++;
复制代码
上面的语句相称于将 s + 1 的计算效果举行了向下转型:
  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. 1 String temp = "a";
  2. 2 switch (temp) {
  3. 3     case "a":
  4. 4         System.out.println("aaa");
  5. 5         break;
  6. 6     case "b":
  7. 7         System.out.println("bbb");
  8. 8         break;
  9. 9 }
复制代码
 switch 不支持 long、float、double,是因为 switch 的设计初衷是对那些只有少数几个值的类型举行等值判断,如果值过于复杂,那么还是用 if 比较合适。
 当switch(expr) 中的expr 是long 类型时,会得到如下清晰的提示

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表