Java基础-8种基本数据类型及其物理实现

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种基本数据类型

类型占用空间大小取值范围默认值表示方式用途
byte8位 - 1字节127 - (-128)0有符号的,以二进制补码表示的整数用在大型数组中节约空间,主要代替int
short16位 - 2字节32767 - (-32768)0有符号的,以二进制补码表示的整数用在大型数组中节约空间,主要代替int
int32位 - 4字节2,147,483,647 - (-2,147,483,648)0有符号的,以二进制补码表示的整数一般地整型变量默认为 int 类型
long64位 - 8字节9,223,372,036,854,775,807 - (-9,223,372,036,854,775,808)0L有符号的,以二进制补码表示的整数主要使用在需要比较大整数的系统上
float32位 - 4字节3.4E+38 - (-3.4E+38)0.0F单精度、32位、符合IEEE 754标准的浮点数储存大型浮点数组的时候可节省内存空间,不能用来表示精确的值,如货币
double64位 - 8字节1.7E+308 - (-1.7E+308)0.0D双精度、64 位、符合IEEE 754标准的浮点数浮点数的默认类型为double类型,不能用来表示精确的值,如货币
char16位 - 2字节\uffff(65,535) - \u0000(0)一个单一的 16 位 Unicode 字符char 数据类型可以储存任何字符
boolean1位true - falsefalse表示一位的信息作为一种标志来记录 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 或 100000000 - 11111111 (十进制:1-254 (0:0、255:无穷)去掉偏移量后的范围:-127 - 128)1111111 11111111 111111113.4028235E38
正数最大值01111 1110(有偏移指数:254、实际值:127)1111111 11111111 11111111(2-2-23) x 2127=3.4028234663852886 x 10^38
正数最小值00000 00001(有偏移指数:1、实际值:-126)0000000 0000000 000000001.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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值