Java-02.06-11

数据类型和分类

简介

在这里插入图片描述

  • 数据类型分类
    1.基本数据类型/原生数据类型:
    2.引用数据类型/对象数据类型:

在这里插入图片描述

布尔类型

简介

在这里插入图片描述

  • 必须要赋值才能用

整数类型(byte-short-int-long)

简介

在这里插入图片描述
在这里插入图片描述

  • java7可以加下划线 0b00000000_01101110

在这里插入图片描述

  • 默认是int

小数类型(float-double)

简介

  • 默认是double类型
  • 3.14E2 表示 314.0
  • 表示小数float 和double 不精确
  • 必须有小数点
  • 科学计数法返回double
    在这里插入图片描述
    在这里插入图片描述

  • 不精确
    101.11 就等于 1 * 2^2 +0 2^1 + 12^0 + 12^-1 + 12^-2 = 4+0+1+1/2+1/4 = 5.75
    在这里插入图片描述

  • float 的存储
    OK,有了上面的知识,我们进入正题:看看float类型在内存中是如何表示的。
    float类型又称为单精度浮点类型,在 IEEE 754-2008 中是这样定义它的结构的:

    S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
    31 30 23 22 0

float类型总共4个字节——32位:

符号位
其中最左边的为符号位,0为正,1为负。
指数
接下来的E是指数,一共8位,也用二进制来表示。
尾数
最后的F是小数部分,尾数正是由这23位的小数部分+1位组成的。(这个稍后解释)。
这里我们需要多说一下指数。虽然指数也是用8位二进制来表示的,但是IEEE在定义它的时候做了些手脚,使用了偏移来计算指数。

IEEE规定,在float类型中,用来计算指数的偏移量为127。也就是说,如果你的指数实际是0,那么在内存中存的就是0+127=127的二进制。稍后我们来看这个到底如何使用。

好了,看了这么多,我们该演示一下计算机如何将一个十进制的实数转换为二进制的。就拿6.9这个数字来举例吧。-_-||!

首先,我们按照上面说的方法,分别将整数和小数转换成对应的二进制。这样6.9的二进制表示就是110.1110011001100…。这里就看出来 了,6.9转换成二进制,小数部分是无限循环的,这在现在的计算机系统上是无法精确表示的。这是计算机在计算浮点数的时候常常不精确的原因之一。

其次,将小数点左移(或右移)到第一个有效数字之后。说的通俗些,就是把小数点移到第一个1之后。这样的话,对于上面的110.1110011001100…我们就需要把小数点左移2位,得到1.101110011001100…。

接下来的事情就有意思了。首先我们把得到的1.101110011001100…这个数,从小数点后第一位开始,数出23个来,填充到上面float内存 结构的尾数部分(就是那一堆F的地方),我们这里数出来的就是10111001100110011001100。这里又要发生一次不精确了,小数点后超出 23位的部分都将被舍弃,太惨了。

不过,这里有一个可能让大家觉得特别坑爹的事情,就是小数点前面的1也不要了。仔细看看上面的内存结构,确实没有地方存放这个1。原因是这样的:IEEE觉 得,既然我们大家都约定把小数点移动到第一个有效数字之后,那也就默认小数点前面一定有且只有一个1,所以把这个1存起来也浪费,干脆就不要了,以后大家 都这么默契的来就好。这也是为什么我上面说尾数是23位+1位的原因。

填充完尾数,该填充指数了。这个指数就是刚才我们把小数点移动的位数,左移为正,右移为负,再按照上面所说的偏移量算法,我们填充的指数应该是2+127=129。转换成8位二进制就是10000001。

最后,根据这个数的正负来填充符号位。我们这里是正数,所以填0。这样6.9的在内存中的存储结果就出来了:

0 10000001 10111001100110011001100

总结一下,实数转二进制float类型的方法:

A. 分别将实数的整数和小数转换为二进制
B. 左移或者右移小数点到第一个有效数字之后
C. 从小数点后第一位开始数出23位填充到尾数部分
D. 把小数点移动的位数,左移为正,右移为负,加上偏移量127,将所得的和转换为二进制填充到指数部分
E. 根据实数的正负来填充符号位,0为正,1为负

如果需要把float的二进制转换回十进制的实数,只要将上面的步骤倒着来一边就行了。


字符类型(char)

简介

  • ASCII
    ASCII 是用来表示英文字符的一种编码规范。每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH)。这对于英文而言,是没有问题的,一般只什么用到前128个(00H–7FH,最高位为0)。而最高位为1 的另128 个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。
    但是对于中文等比较复杂的语言,255个字符显然不够用。于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312—80”, 它是和ASCII 兼容的一种编码规范, 其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII 字符来表示,以区分ASCII 码部分。
    但是这个方法有问题,最大的问题就是中文的文字编码和扩展ASCII 码有重叠。而很多软件利用扩展ASCII 码的英文制表符来画表格,这样的软件用到中文系统中,这些表格就会被误认作中文字符,出现乱码。另外,由于各国和各地区都有自己的文字编码规则,它们互相冲突,这给各国和各地区交换信息带来了很大的麻烦。

  • Unicode是一种编码方式,用来对a和97映射
    要真正解决这个问题,不能从扩展ASCII 的角度入手,UNICODE作为一个全新的编码系统应运而生,它可以将中文、法文、德文……等等所有的文字统一起来考虑,为每一个文字都分配一个单独的编码。
    在这里插入图片描述

在这里插入图片描述

  • u 代表unicode,十六进制
  • unicode前256和ascii一样

最常用的引用类型String

简介

在这里插入图片描述
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章