java的数据存储方式_Java 数据存储方式

众所周知在计算机中所有的数据都是以二进制的方式存储的。不管是int,String,float等等不同的数据类型,最终都会保存为01的形式。那么为什么要使用这种方式储存数据呢?

因为计算机是一种电子设备,由复杂的电子元器件组合而成,一个电子元器件有带电和不带电两种状态,通常我们将带电状态表示为数值1,不带电状态表示为数值0,多个这样的元器件的组合可以表示更多状态,也就是可以表示更多的数据,如000表示0,001表示1,010表示2,011表示3,依此类推,111表示 7,一个元器件可表示一位(bit)数据,这种表示数据的方式就叫二进制。

在实际的电子设备中,我们将8个这样的元器件形成一个单元,这样的单元叫一个字节(byte),一个字节能表示多少个数呢?表示数值的范围是0-255。

一个字节由8个二进位组成,其中最右边的一位称为“最低有效位”或“最低位”,最左边的一位称为“最高有效位”或“最高位”。每一个二进位的值是0或1。

二进制计数的缺点:书写太长,容易出错,一般计算机的数据位数都是4的整数倍,所以,在计算机里通常采用16进制计数法。用数字可以表示各种信息,计算机里只有数值,当你在内存中看到一个数值时,这个数值可能代表各种意义,生活中的数值也可以代表其他意义,如1234可以代表密码,存款额,电报信息,根据上下线索,我们就能够知道这数值代表的意义

但是在Java中到底是如何去保存数据的呢?下面我就以int数据类型为例说明Java的方式。

大家都知道在Java中规定1 int = 4 byte, 1 byte = 8 bit。以此推理那么1个int在计算机中就是以4 * 8 = 32位(bit)的方式存储的。而又由于java中的int是属于有符号类型(Java中不存在unsigned类型),所以32位的高一位是符号位,由此可以推理出int的储存大小区间

Integer.MAX_VALUE = 2147483647(十进制) = 1111111 11111111 11111111 11111111(二进制)

Integer.MIN_VALUE = -2147483648(十进制) = 10000000 00000000 00000000 00000000(二进制)

现在我们知道了二进制的概念了,但是其实二进制我想我们想象的那么单纯的表示的,他们是不同的表现方式如:原码,反码,补码

原码将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值(以二进制表示)。

为了简单起见,我们用1个字节来表示一个整数。

+7的原码为: 00000111

-7的原码为: 10000111

反码      一个数如果为正,则它的反码与原码相同;一个数如果为负,则符号位为1,其余各位是对原码取反。

为了简单起见,我们用1个字节来表示一个整数。

+7的反码为: 00000111

-7的反码为: 11111000

补码    利用溢出,我们可以将减法变成加法。

对于十进制数,如果从9得到结果5,可以用减法:

9-4=5

因为4+6=10,我们将6作为4的补数,将上式的减法改写为加法:

9+6=15

去掉高位1(也就是减去10),得到结果5。

对于16进制数,如果从C得到结果5,可以用减法:

C-7=5

因为7+9=16,我们将9作为7的补数,将上式的减法改写为加法:

C+9=15

去掉高位1(也就是减去16),得到结果5。

在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为:

1 00000000

进位1被丢弃。

一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。

为了简单起见,我们用1个字节来表示一个整数。

+7的补码为: 00000111

-7的补码为:第一步:11111000 (符号位为,其余各位取反)

第二步:11111001 (整个数加1)

+0的补码:00000000;

-0的补码:11111111;(第一步)

100000000;(第二步)

已知一个负数的补码,将其转换为十进制数,步骤:

1、先对各位取反;

2、将其转换为十进制数;

3、加上负号,再减去1。

例如:

11111010,最高位为1,是负数,先对各位取反得00000101,转换为十进制数得5,加上负号得-5,再减1得-6。

那么我们就知道了1与-1的二进制形式分别为0000000 00000000 00000000 00000001和11111111 11111111 11111111 11111111(Java中的数据是以补码的形式储存的)了。那么现在我们知道了数据是如何储存的了。那么计算机是如何利用这些数据进行计算的呢?我们知道在计算机的CPU中只有一个加法器,所有的运算都是需要它进行的。所以在计算机里所有的加减乘除都是转换成加法来进行运算的。那么它们是怎么转换的呢?下面我们介绍一下二进制的运算操作

位运算符

为了方便对二进制位进行操作,Java给我们提供了四个二进制位操作符:

&          按位与

|           按位或

^          按位异或

~          按位取反

按位与    一个房间里有两个开关控制房间的灯的明暗。当两个开关同时处于打开状态时,灯才能亮。

开关1                   开关2                         灯的状态

关                         关                              暗

开                          关                              暗

关                          开                              暗

开                          开                              亮

结论:按位与,只有壹(1)壹(1)为1。

按位或    一个房间里有两个开关控制房间的灯的明暗。当任何一个开关处于打开状态时,灯就能亮。

开关1                     开关2                     灯的状态

关                         关                              暗

开                          关                              亮

关                          开                              亮

开                          开                              亮

结论:按位或,只有零(0)零(0)为0。

按位异或

一个房间里有两个开关控制房间的灯的明暗。当两个开关处于不同状态时,灯就能亮。

开关1                    开关2                       灯的状态

关                          关                              暗

开                          关                              亮

关                          开                              亮

开                          开                              暗

结论:按位异或,只有零(0)壹(1)或壹(1)零(0)为1。

按位取反结论:对二进制数按位取反,即0变成1,1变成0。

Java中有三个移位运算符

左移:<

带符号右移:>>     (相当于 除以2)

无符号右移:>>>

数            x                   x<<2                 x>>2              x>>>2

17      00010001    00 01000100      00000100 01     00000100 01

-17     11101111     11 10111100      11111011 11     00111011 11

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值