基本数据类型
10进制与二进制间的转换
十进制整数与二进制整数间的转换
- 十进制到二进制:
按照从下到上进行拼接,结果为:11111
二进制整数与十进制整数间的转换
1 x 24 + 1 x 23 + 1 x 22 + 1 x 21 + 1 x 20 = 31
十进制小数与二进制小数间的转换
十进制0.125为例:
- 0.125 x 2 = 0.25 取0
- 0.25 x 2 =0.5 取0
- 0.5 x 2 = 1 取1
- 从上到下方式拼接二进制为:0.001
二进制小数与十进制小数间的转换
二进制0.001为例:
- 小数点后第一位:0 x 2-1
- 小数点后第二位:0 x 2-2
- 小数点后第三位:0 x 2-3
- 相加:0 x 2-1 + 0 x 2-2 + 0 x 2-3 = 0.125
8种基本数据类型
类型 | 占用空间大小 | 取值范围 | 默认值 | 表示方式 | 用途 |
---|---|---|---|---|---|
byte | 8位 - 1字节 | 127 - (-128) | 0 | 有符号的,以二进制补码表示的整数 | 用在大型数组中节约空间,主要代替int |
short | 16位 - 2字节 | 32767 - (-32768) | 0 | 有符号的,以二进制补码表示的整数 | 用在大型数组中节约空间,主要代替int |
int | 32位 - 4字节 | 2,147,483,647 - (-2,147,483,648) | 0 | 有符号的,以二进制补码表示的整数 | 一般地整型变量默认为 int 类型 |
long | 64位 - 8字节 | 9,223,372,036,854,775,807 - (-9,223,372,036,854,775,808) | 0L | 有符号的,以二进制补码表示的整数 | 主要使用在需要比较大整数的系统上 |
float | 32位 - 4字节 | 3.4E+38 - (-3.4E+38) | 0.0F | 单精度、32位、符合IEEE 754标准的浮点数 | 储存大型浮点数组的时候可节省内存空间,不能用来表示精确的值,如货币 |
double | 64位 - 8字节 | 1.7E+308 - (-1.7E+308) | 0.0D | 双精度、64 位、符合IEEE 754标准的浮点数 | 浮点数的默认类型为double类型,不能用来表示精确的值,如货币 |
char | 16位 - 2字节 | \uffff(65,535) - \u0000(0) | 空 | 一个单一的 16 位 Unicode 字符 | char 数据类型可以储存任何字符 |
boolean | 1位 | true - false | false | 表示一位的信息 | 作为一种标志来记录 true/false 情况 |
bye,short、int、long取值范围计算方法
这4中基本类型都是以有符号的,二进制补码表示的整数。
为什么要使用补码进行表示?
- 原码
正数1的原码为 00000001
负数1的原码为 10000001
1-1通过1+ -1来进行计算:结果如图所示如果直接用原码进行计算,1-1结果为2
- 反码
正数1的原码为 00000001
负数1的原码为 111111110
1-1通过1+ -1来进行计算:结果如图所示如果直接用反码进行计算,1-1结果为-0,虽然是0,但是-0并不符合逻辑。
- 补码
正数1的原码为 00000001
负数1的原码为 111111111
1-1通过1+ -1来进行计算:结果如图所示如果直接用补码进行计算,1-1结果为+0,所以这些整数类型使用补码进行表示。
取值范围计算
以byte为例:
char取值范围
char是16为无符号位Unicode字符所以取值范围为 0 -65536:
2^15 * 1 + 2^14 * 1 + 2^13 * 1 … 2^2 * 1 + 2^1 * 1 + 2^0 * 1 = 65535
double和float取值范围计算
IEEE754浮点数表示法
IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。
IEEE 754规定了四种表示浮点数值的方式:
- 单精确度(32位)
- 双精确度(64位)
- 延伸单精确度(43位以上,很少使用)
- 延伸双精确度(79位以上,通常以80位实现)。
首先说明一下计算机表达小数的方式(科学记数法):
- 19971400000000
- 1.99714*10^13 (科学记数法表示)
- 1.99714E13 (计算机中幂一般用E或e表示)
一个浮点数 (Value) 的表示其实可以这样表示:
浮点数的实际值 = 符号位(sign bit)* 指数偏移值(exponent bias) * 尾数值(fraction)。
IEEE754 表示法各部分表示什么:
例如:1789.2345(科学记数法格式化后:1.7892345E3)
- 符号部分:表示是正数(0)还是负数(1),此例中为:0
- 指数部分:小数经过科学记数法格式化后的指数(E后的数字):3
- 尾数部分:取小数点后的数字:7892345
各类型浮点数各个部位的具体位数:
- 指数偏差:指数偏差(表示法中的指数为实际指数减掉某个值)为 ,其中的e为存储指数的比特的长度。减掉一个值因为指数必须是有符号才能表达很大或很小的数值,但通常有符号数通常使用补码表示,将会使比较变得困难。为了解决这个问题,指数在存储之前需要做偏差修正,将它的值调整到一个无符号数的范围内以便进行比较。此外,指数采用这种方法表示的优点还在于使得浮点数的正规形式和非正规形式之间有了一个平滑的转变。指数偏差。
- 指数偏移值:指数偏移值,是指浮点数表示法中的指数域的编码值为指数的实际值加上某个固定的值,IEEE 754标准规定该固定值为 2e-1 -1 ,其中的e为存储指数的比特的长度。
以单精度浮点数为例:e = 8 ,则偏移值为:127 例如实际值为:13,在单精度浮点数中指数编码为:13+127 = 140
十进制小数到IEEE754 格式的转换:
符号部分 + (指数部分 + 偏移量)转换为二进制 + 尾数部分转换为2进制
TIPS:此处的+是拼接符,不做加法处理。
176.0625表示为单精度浮点数示例;
- 小数点前整数部分转换为2进制:10110000
- 小数点后小数部分转换为2进制:0001
- 176.0625的二进制表示法为:10110000.0001
- IEEE754格式化规则:
- 约定小数点左边保留一位(通常是1):10110000.0001 = 1.0110000.0001 * 27(因为是2进制,所以底数是2,不是10)
- 约定单精度指数偏移量为127:指数为7 + 127 = 134 二进制为:10000110
- 约定单精度尾数位长度为23:尾数为:01100000001000000000000(只取小数点后,不足补0)
- 约定第一位为符号位:正整数及0用0表示、负数用1表示。
- 由上得出:176.0625使用IEEE754规格化后的表示为: 0 10000110 01100000001000000000000
IEEE754 格式单精度浮点数到十进制小数的转换:
1011 11101 110 0000 0000 0000 0000 0000
- 指数位转换成10进制 - 127:011 11101(125-127= -2)
- 尾数位转换成10进制:1 x 20 +1 x 2-1 + 1 x2-2 + 0 x 2-3 = 1.75
- 根据公式计算:-1.75(十进制)*2^(-2) = -0.4375
float
float为32 位表示的单精度浮点数,运行速度相比double更快,占内存更小,但是当数值非常大或者非常小的时候会变得不精确。
组成:符号位(S)1、指数位(E)8(偏移量127)、尾数位(M)23(约定小数点左边保留一位,通常这位数是1,所以上述单精度尾数长度实际为24(默认省略小数点左边的1则为23))
其取值范围由指数来定,剩余尾数23位最多可表示223个有效数字,用log计算,log10(2*223)=6.92,因此其有效数字为6~7位。
最大-最小值 | 符号位(2进制) | 指数位(2进制) | 尾数位(2进制) | 转换为十进制后的值 |
---|---|---|---|---|
取值范围 | 0 或 1 | 00000000 - 11111111 (十进制:1-254 (0:0、255:无穷)去掉偏移量后的范围:-127 - 128) | 1111111 11111111 11111111 | 3.4028235E38 |
正数最大值 | 0 | 1111 1110(有偏移指数:254、实际值:127) | 1111111 11111111 11111111 | (2-2-23) x 2127=3.4028234663852886 x 10^38 |
正数最小值 | 0 | 0000 00001(有偏移指数:1、实际值:-126) | 0000000 0000000 00000000 | 1.0000 0000 0000 0000 0000 001*2^-126= 1.1754944909521339e-038 |
tips:1 x 2-0 + 1 x 2-1 + 1 x 2-2 + 1 x 2 -3 + … + 1 x 2-23 = 1 + 1/2 + 1/4 … = 2 - 2-23
double
比起单精度浮点数(float),double(双精度浮点数)使用 64 位(8字节) 来储存一个浮点数。 它可以表示十进制的15或16位有效数字,负值取值范围为 -1.7976E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.797693E+308。