您的位置 首页 java

浅谈JAVA中的基本变量

作为一门面向对象编程的语言,JAVA也不例外,拥有大多数编程语言都具有的变量类型: 值类型 ,一般情况下,将JAVA中的值类型称为 基本类型 ,其它的类型则为 引用类型 。本次讨论研究的就是 基本类型

学过C语言的朋友们都知道,在C语言中包含的数据类型有 short、int、long、char、float、double ,JAVA作为C语言的“升级版”,同时增加了 byte boolean ,严格来说C语言中是没有 boolean 类型的,在进行条件判断的时候,一般将非0的值作为 true ,0作为 false 。JAVA中单独定义了一种变量类型用于条件判断,且无法像C语言那样直接将数字作为 boolean 作为判断条件,请看以下代码:

  int flag = 1;
 //C语言版本:可将非0值看作true,0看作false
 if (flag) {
     printf_s("Hello World");
 }
 //JAVA版本:编译时会将 flag != 0 编译为boolean类型
 if (flag != 0) {
     System.out.println("Hello World");
 }
 //编译的class文件(部分),供参考
 public static void main(String[] var0) {
     boolean var1 = true;
     boolean var2 = false;
     if (var1) {
         System.out.println("Hello World");
     }
 }  

上面简单的对JAVA的 boolean 类型作了一个小扩展,这里开始讲解JAVA的八大基本类型,下表就表示了JAVA中的基本数据类型以及它们的取值范围。

JAVA基本数据类型四类八种

这时候就有小伙伴问啦,为什么整数要用四个数据类型来分开表示,且它们的取值范围是如何来的呢?

为什么整数要用四个数据类型来分开表示整型呢?

那是因为最早的个人计算机内存实在太小了,1976年苹果发布的 Apple II 也只有4KB内存。所以要想设计一个好的程序,必须竭尽所能地节省内存。而上面四种数据类型正是对应不同的存储大小。一个int类型能储存接近22亿大的数字,它占4字节,在那时候你却用它来储存人的年龄,那项目经理就会对你投以“和善”的目光。又或者你要用int类型来储存马云的钱(不考虑小数),马云听了想打人[笑哭][笑哭][笑哭]。

它们的取值范围是如何来的呢?

计算机中规定:一个二进制数为 1Bit ,8比特为一个字节(Byte),字节(Byte)也是电脑中表示信息含义的最小单位。也就是说你在计算机中哪怕存了一个0,也要用8bit来表示 0000_0000 ,那么使用1字节最多能表示2^8-1个二进制数字也就是 0~255 个。那么负数呢?正好正负也是两种状态,同样完美契合二进制,所以就规定,最高位(第一位)用来代表正负,0为正、1为负。那么能用来表示有效数的bit就只有7位了,只能表示2^7-1个数,也就是 0~127 。算上最高位的符号位,1字节能表示的有效数就是 -127~127

上面的结论看上去好像没什么毛病,但小伙伴们请思考一个问题 0000_0000、1000_0000 ,这两个分别代表什么呢?+0和-0?小学知识就告诉我们0是不分正负的。所以为了不浪费的精神,人们规定在Byte里面 1000_0000 代表-128。那么1个字节最终能表示的有效数为 -128~127 ,这也是小伙伴们在学习一门编程语言时整型的有效范围为什么负数总比正数多一个。以JAVA为例,规定short占两个字节,也就是一个short数据类型用16个二进制来表示,那么它能表示的最大范围就是2^{15}-1(去掉最高位的符号位),算上符号有效范围就 -32768~32767 ,int占4个字节,long占8个字节,小伙伴们可以动手算一算它们能表示的有效数范围。它叫计算机,又能表示数,那么就要发挥它的计算功能。二进制的计算和十进制原理一样,只是在计算中逢2进1,如下:

  #比如1+1
  0000 0001
 +0000 0001
 =0000 0010  

低进制向高进制转换的公式为:以上面2进制0000 0010为例:最高位符号位不计入

低进制转高进制,以1字节的二进制的2为例

一切要是都这么美好该多好,请看一个例子:正一加上负一

     0000 0001
 +1000 0001
 =1000 0010  

通过上面的公式代入一计算,我滴的乖乖,等于-2。如何解决呢?这个世界总不缺聪明的人,这时候就有人提出了补码和反码的概念:而计算机没有真正意义上的减法,所以其实在计算机中,为了方便计算,数字都是以补码的形式储存。

那么来换算一下-1的反码

  1000 0001  #-1的原码
 1111 1110  #反码
 1111 1111  #补码
 
 #补码代入运算  1 + -1
     0000 0001
 + 1111 1111
 =10000 0000 #只有8位有效数字,所有最高位的1在参与运算后舍弃
     0000 0000 #舍弃后最终结果  

至于它们在内存中是如何储存的,我觉得Excel是一个非常好的示范,我们把一个格子当作一个储存单位,它只能储存一个0或1,那么要储存 0和1 这两个数字,在内存是如何储存的呢(以Byte为例)

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

因为规定了8bit为一个有效储存单位,而在声明变量的时候声明的byte类型,占1字节也就是8比特,那么每8位为一个有效数字,计算机就依次读取8bit然后进行转换,就得到了0和1。如果这时咱们规定每四位为一个有效数字,那么上面的表格就能表示四个十进制有效数字,分别为:0 0 0 1。其余的数据类型依此类推。

到此为止,小伙伴们应该就知道为什么要出现四种不同的表示整型的数据类型了吧,以及计算机是如何进行计算的,待下期咱们来谈一下比较复杂的浮点数以及更多内存相关概念。

文章来源:智云一二三科技

文章标题:浅谈JAVA中的基本变量

文章地址:https://www.zhihuclub.com/182372.shtml

关于作者: 智云科技

热门文章

网站地图