网站首页 > 精选教程 正文
作为一门面向对象编程的语言,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中的基本数据类型以及它们的取值范围。
这时候就有小伙伴问啦,为什么整数要用四个数据类型来分开表示,且它们的取值范围是如何来的呢?
为什么整数要用四个数据类型来分开表示整型呢?
那是因为最早的个人计算机内存实在太小了,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为例:最高位符号位不计入
一切要是都这么美好该多好,请看一个例子:正一加上负一
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基础(十三):基本数据类型的转换
- 下一篇: JVM基础学习 jvm入门到精通
猜你喜欢
- 2024-11-10 为什么28岁不能学java? 28岁开始学编程晚吗
- 2024-11-10 gc的年龄信息存储在什么地方? 年龄信息用什么数据类型存储
- 2024-11-10 JVM基础学习 jvm入门到精通
- 2024-11-10 Java-对象到底占多少个字节?计算规则是什么?
- 2024-11-10 大数据必学Java基础(十三):基本数据类型的转换
- 2024-11-10 Java码农35岁之后只能送外卖? 我的世界java
- 2024-11-10 这些Java基础知识,诸佬们都还记得嘛(学习,复习,面试都可)
- 2024-11-10 2021-01-03:java中,描述一下什么情况下,...
- 2024-11-10 零基础学Java之数据类型与变量(上集)
- 2024-11-10 JAVA基础总结:变量和数据类型 java入门变量与数据类型第一关
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)