Java中的数据类型

点赞 0
收藏 0
创建时间 2020-02-09
章节介绍:

§ 数据类型的分类

java中声明或存储数据时需要知道该数据的类型,在java中共有八种基本数据类型和引用类型组成, 按其类型不同我们分类如下几种:

  1. 数值型:byte short int long
  2. 浮点型:float double
  3. 字符型:char
  4. 布尔型:boolean
  5. 引用型:Object

我们对上面的类型做一下解释:

  1. 数值型:主要指整数,不带小数点的数字,如正整数,负整数,

  2. 浮点型:是指带小数点的数字,正负都包括。

  3. 字符型:指单个的字符,例如字符:'a', 'b', '我', '中'

    注意事项:


    • java中一个char字符只能存储一个字符,不能存多个字符。
    • java中标识字符类型时我们需要使用单引号引起来。不能使用双引号,因为双引号是用来引字符串的。
    • 一个字符是可以存储一个中文的。 因为char在java中占两个字节,这点我们后面会讲到
  4. 布尔型:布尔型就是我们生活中的真(true)或假(false),它只有两种情况,要么真,要么假。我们以后的编程中会有很多数据用到这个类型。例如:有没有结婚、是不是会员等。更贴实际的一些情景例如:有没有房子、有没有车子、有没有票子 _。凡是这种要么是要么不是的情景都可以使用boolean类型标识。

  5. 引用类型:除了八种基本数据类型以为的类型我们都可以理解为引用类型。它就是我们以后要写的类(class)

§ 计算机存储单位

在计算机中存储数据需要有一个单位来表示,我们生活中能碰到的最多的就是G或KB。例如:我这个月的手机流量用了20G。这个G就是计算机中存储单位的一种。

  1. 分类

    按从小到大的顺序存储单位如下表示:

    位(bit) 字节(Byte) 千字节( Kilo Byte ) 兆字节( Mega Byte ) 吉字节( Giga Byte ) 太字节( Tera Byte)
    b B KB MB GB TB

    我并没有列举全部单位,在TB后面还有很多更大的单位。有一点注意就是位(b)使用小写的b来表示的

  2. 单位的换算

    我摘了百科的段落:

    1B(byte 字节)=8bit

    1KB(Kilobyte 千字节)=1024B,

    1MB(Megabyte 兆字节 简称“兆”)=1024KB,

    1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,

    1TB(Terabyte 万亿字节 太字节)=1024GB,

    总结


    除了bit转到B是用8换算以外。剩下的都是以1024换算。计算机领域很多数据单位都是跟2有关的。一般都是2的多少次幂。例如:硬盘容量128G,256G,内存条的内存:2G/4G/8G等。

    小话题


    • 为什么我的U盘、硬盘容量比标准值要少?

      有时候我们买的U盘比如是8G的,但是插上电脑后发现只有7.9G可用,感觉少了。其实是因为生产厂商的换算是以1000作为数据换算的,而计算机是以1024进行换算得出容量的。例如:生产厂商造了个8G的U盘,它的容量为 8,000,000,000(10)字节 ,但是计算机算容量的时候按1024进行换算,显示的就是7.45G。

    • 10M宽带最大下载速度是多少?

      例如我买了电信的10M带宽,那么我们的最大下载速度有多少呢?有很多人认为那不就是10M吗?其实不是的,因为10M带宽的单位是:10Mbps注意这个单位的b是小写的,是指的(bit的意思)。而生活中我们使用的KB,GB都是大写的B(字节)。因为1B = 8bit所以最大下载速度为:1.25MBps

§ 数据在内存中的表示方式

  • 高位、低位、符号位

    在计算机中以1Byte为例从右向左 是一个由低到高的过程,即:右边是低位,左边是高位,最高位我们成为符号位,符号位用来表示数字的正负,0表示正数,1表示负数

    数字10(符号位) 0000001
           高位 ----------低位 
    数字-11(符号位) 0000001
           高位 ----------低位   
           
    
    
  • 补码的出现

我们来想一个问题:-1+1=0-4+5=1,这个等式使用二进制如何运算?

-1 的二进制表示: 1(符号位)   0000001 
+1 的二进制表示: 0(符号位)   0000001
------------------------------------------
表达式:-1+1的表示为:     1 0000001
    				+   0 0000001
    				--------------
    					1 0000010 = -2
================================================
-4 的二进制表示: 1(符号位)   000010 
+5 的二进制表示: 0(符号位)   0000101
------------------------------------------
表达式:-4+5的表示为:     1 0000100
    				+   0 0000101
    				--------------
    					1 0001001 = -9

存在的问题:


  • 我们发现-1+1 = 0使用上面二进制运算后结果不是0,而是 -2
  • -4+5的结果不是1而是-9,不但算错了,而且符号位也不对(因为我们的符号位是直接相加得到的,这是错误的。)

原因:


其实计算机运算所使用的编码格式并不是我们看到的这样的,而是使用补码来运算的。

  • 原码、反码、补码

    -4+5这一个很简单的公式对于计算机来讲如果不采用一定的办法很难计算,因为它里面由符号位,计算机没有办法区分你最终的结果是正还是负。为了方便计算,并且让符号位一起参加运算,便引入了补码

    • 原码:我们刚才写的将十进制数字直接写成的二进制形式就是原码。eg:1(0 0000001) -1(1 0000001)
    • 反码:正数的反码和原码相同,负数的反码是在原码基础上符号位不变,数值为取反 ,eg:1(0 00000001) -1(1 11111110)
    • 补码:正数的补码和原码相同,负数的补码是在反码的基础上加1。eg:1(0 0000001 ) -1(1 1111111)

    规律总结


    正数的原码、反码、补码是一样的。

    负数的补码是先将原码符号位不变数值位取反变成反码,再在反码的基础上加1。

  • 使用补码能解决运算的问题吗?

    我们还是做刚才的运算

    -1 的二进制表示:  原码: 1 0000001  反码:  1 1111110  补码:1 1111111
    +1 的二进制表示:  原码: 0 0000001  反码:  0 0000001  补码:0 0000001
    ------------------------------------------
    使用补码运算(符号位一起参加运算):
    			-1+1的表示为:    1 1111111
        					+   0 0000001
        				    --------------
        					1   0 0000000  由于我们使用的单位是Byte只能存储8位,所以最高位的1被舍弃
        最高位1舍弃后为:          0 0000000 = 0 					
    ================================================
    -4 的二进制表示: 原码: 1 0000100  反码:  1 1111011  补码:1 1111100
    +5 的二进制表示: 原码: 0 0000101  反码:  0 0000101  补码:0 0000101
    ------------------------------------------
    使用补码运算(符号位一起参加运算):
                            1 1111100
        				+   0 0000101
        				--------------
        					0 0000001 = 1
    	
    

    我们看到使用补码后两个表达式均正确。所以我们要记住计算机底层是使用补码进行运算的

  • 取值范围

    我们还以1Byte为例,计算1Byte的最大取值范围和最小取值范围,因为现在我们有三种形式可以表示数组(原码,反码,补码),因此我们要用三种形式来表示取值范围

    • 原码表示取值范围

      1Byte 最大值的二进制:原码:0(符号位) 1111111  = 127
      1Byte 最小值得二进制:原码:1(符号位) 1111111  =-127
      所以以原码方式表示 1Byte的取值范围是:-127127
      
      
    • 反码表示取值范围

      1Byte 最大值的二进制:反码:0(符号位) 1111111  = 127
      		反码中最大值127等于原码中的127,因为正数的原码反码相同
      		--------------------------------------------------------------------
      1Byte 最小值得二进制:反码:1(符号位) 1111111  =-127
      		反码中最小值127等于原码中的-0,因为反码是原码的符号位不变,数值为取反 
      所以以反码的维度看1Byte的取值范围也是:-127到127
      
      

      我们看到以反码为维度的取值范围是-127到127,但是我们要注意到里面包含了-0和0两个数字,所以反码中有两个0

    • 补码表示取值范围

      1Byte 最大值的二进制:补码:0(符号位) 1111111  = 127
      		补码中最大值127等于原码中的127,因为正数的原码反码补码都相同
      		--------------------------------------------------------------------
      1Byte 最小值得二进制:补码:1(符号位) 1111111  =-127
      		补码中最小值127等于原码中的-1,因为补码是原码的符号位不变,数值为取反 再加1得到的。
      不加干涉情况下以补码的维度看1Byte的取值范围也是:-127到127 
              
      

      如果我们不加任何干涉那么补码的取值范围也是-127-127但是补码跟反码一样也存在-0和0两个零。

             没有干涉前存在两个原码对应的0: -00:
      		原码 -01 0000000      0:0 0000000
              反码 -01 1111111      0:0 0000000
              补码 -01 0000000      0:0 0000000
      

      补码中存在原码的两个0,-0:1 0000000 0:0 0000000,而计算机是使用补码来运算的,那么我们需要使用0的时候用那个呢?这样就混淆了。而且不能保证每一个数值是唯一的。所以我们人为的规定-0就是-128-0对应的补码是1000 0000 ,那么就是说补码1000 0000对应的就是 -128,也是最小值。最终正确的取值范围是:-128-127

      我在网上摘取了一些信息帮你更好的理解:

      摘自:https://www.cnblogs.com/flowerslip/p/5933833.html
      
      从补码的意义上去理解 
      因为:256-128=256+(-128)的补码 --机器中只有加法。减法会变成补码的加法。
      而   256-128=128 
      所以   256+(-128)的补码=128 
      所以       (-128)的补码=256-128 
                             =128 
      数学上, 128=1000 0000 
      故规定 -128的补码为 1000 0000 
      注意:只是规定而已,下面还有原因。
       
      8位二进制 的补码组合序列有256个
      0000 0000 - 0111 1111    0 ~+127
      1000 0000                       用来干啥好呢?                              
      1000 0001 - 1111 1111    -1~-127
      
      再看看这个规律表
         原码            补码         值
      0111 1111   0111 1111   +127
      0111 1110   0111 1110   +126
           ...          .. 补码不断-1...
      0000 0000   0000 0000     0
      1000 0001   1111 1111    -1
      1000 0010   1111 1110    -2
      1000 0011   1111 1101    -3
          ...          .. 补码不断-1...
      1111 1111   1000 0001    -127
      无法表达     1000 0000    -128
       
      于是就有了规定 1000 0000 定为 -128的补码
      这种定法和上面数学层面的表述是一致的。
      

§ 每种数据类型的取值范围

§ 计算机存储的基本单位

B(字节)是我们用来表达容量的基本单位bit 是计算机最小的存储单位,1B= 8bit。其中B(字节)是我们定义每个数据类型的内存空间的基本单位。例如:我们通常会说int类型数据占4个字节,而不会说int类型占32位。我们拿数字1的内存模型来描述B和bit的对应关系如图所示:

知识点


  • 每一位(bit)上只能存储一个数字,要么0要么1。
  • 所有的数据都是由这样的0和1组成的。

§ 每个数据类型的空间大小和取值范围

计算机领域不同的操作系统,不同的变成语言,还有32位系统或64对数据类型的大小定义稍有不同,我们下面所讲的内容都是以java语言的数据类型为基础。

我们以1Byte为例来计算取值范围

知识点


  • ***计算规则:***通过上图我们看到最高位是符号位。后面7位是数据位 因此当 符号位为1(负数),数值为全是1时最小,当符号位为0,数值为全是1时最大。因此取值范围是:-128到127。关于-128的问题我们刚刚在上面的补码环节讲过了就不在啰嗦了。

8中基本类型的字节个数列举如下

数据类型 [包装类][baozhuanglei] 字节数 默认值 取值范围(原码维度) 取值范围(反码维度) 取值范围(补码维度)
byte Byte 1Byte 0 -2^7-1到 2^7-1
(-127-127)
-2^7-1到 2^7-1
(-127-127)
-2^7到 2^7-1
(-128到127)
short Short 2Byte 0 -215-1到215-1 –215-1到215-1 -215到215-1
int Integer 4Byte 0 -231-1到231-1 -231到231-1 -231到231-1
long Long 8Byte 0 -263-1到263-1 -263-1到263-1 -263到263-1
float Float 4Byte 0.0 -231-1到231-1 -231-1到231-1 231到231-1
double Double 8Byte 0.0 -263-1到263-1 -263-1到263-1 263到263-1
char Character 2Byte ‘\u0000’ -215-1到215-1 -215-1到215-1 -215到215-1
boolean Boolean 1/8Byte false 0到1 0到1 0到1

知识点


  • 原码维度和反码为取值范围规律:-2^(位数-1)到 2(位数-1)-1,而补码维度取值范围的规律:-2(位数)到 2^(位数-1)-1

  • boolean只能表示ture或false,因此只有1bit(1/8Byte)。

  • char默认占2Byte。并且一个char类型可以存储一个汉字,因为一个汉字在存储时刚好两个字节。

  • 表格中的的包装类是基本数据类型对应的引用类型,该阶段还不能理解其作用,但是我们要先背下来,因为以后开发中我们基本都是使用包装类,而基本数据类型反而不怎么用。

  • 数值型的默认值都是0,但是注意整数的默认值是 0,而浮点型的默认值是:0.0

  • char的默认值是:\u0000,因为char表示单个字符,因为世界上所有文字需要统一编码,规则按照\u后面加上十六进制代码来表示Unicode字符 统一编写。而底层编码是从初始值\u0000开始的。我们中国的汉字取值范围是:[\u4e00]-[\u9fa5],有兴趣的同学可以搜索一下正则表达式

  • boolean的默认值是false(假)。