java中声明或存储数据时需要知道该数据的类型,在java中共有八种基本数据类型和引用类型组成, 按其类型不同我们分类如下几种:
我们对上面的类型做一下解释:
数值型:主要指整数,不带小数点的数字,如正整数,负整数,
浮点型:是指带小数点的数字,正负都包括。
字符型:指单个的字符,例如字符:'a', 'b', '我', '中'
等
注意事项:
字符串
的。布尔型:布尔型就是我们生活中的真(true)或假(false),它只有两种情况,要么真,要么假。我们以后的编程中会有很多数据用到这个类型。例如:有没有结婚、是不是会员等。更贴实际的一些情景例如:有没有房子、有没有车子、有没有票子 _。凡是这种要么是要么不是的情景都可以使用boolean类型标识。
引用类型:除了八种基本数据类型以为的类型我们都可以理解为引用类型。它就是我们以后要写的类(class)
在计算机中存储数据需要有一个单位来表示,我们生活中能碰到的最多的就是G或KB。例如:我这个月的手机流量用了20G。这个G就是计算机中存储单位的一种。
分类:
按从小到大的顺序存储单位如下表示:
位(bit) | 字节(Byte) | 千字节( Kilo Byte ) | 兆字节( Mega Byte ) | 吉字节( Giga Byte ) | 太字节( Tera Byte) | … |
---|---|---|---|---|---|---|
b | B | KB | MB | GB | TB | … |
我并没有列举全部单位,在TB后面还有很多更大的单位。有一点注意就是位(b)使用小写的b来表示的。
单位的换算
我摘了百科的段落:
1B(byte 字节)=8bit
1KB(Kilobyte 千字节)=1024B,
1MB(Megabyte 兆字节 简称“兆”)=1024KB,
1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,
总结
除了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表示负数
数字1: 0(符号位) 0000001
高位 ----------低位
数字-1: 1(符号位) 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
这一个很简单的公式对于计算机来讲如果不采用一定的办法很难计算,因为它里面由符号位,计算机没有办法区分你最终的结果是正还是负。为了方便计算,并且让符号位一起参加运算,便引入了补码
1(0 0000001) -1(1 0000001)
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的取值范围是:-127到127
反码表示取值范围
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: -0 和0:
原码 -0: 1 0000000 0:0 0000000
反码 -0: 1 1111111 0:0 0000000
补码 -0: 1 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的对应关系如图所示:
知识点
计算机领域不同的操作系统,不同的变成语言,还有32位系统或64对数据类型的大小定义稍有不同,我们下面所讲的内容都是以java语言的数据类型为基础。
我们以1Byte为例来计算取值范围
知识点
符号位为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(假)。