说明
任何东西都有规范,提到JAVA就会提到2个规范,JAVA语言规范、JVM规范。JAVA语言规范主要定义JAVA的语法、变量、类型、文法等等,JVM规范主要定义Class文件类型、运行时数据、帧栈、虚拟机的启动、虚拟机的指令集等等。
规范中数字的内部表示和存储
JAVA八种基本数据类型:
数据类型 | 所占位数 |
---|---|
int | 32bit |
short | 16bit |
long | 64bit |
byte | 8bit |
char | 16bit |
float | 32bit |
double | 64bit |
boolean | 1bit |
备注:1字节=8位(1 byte = 8bit)
整数的表示
备注:补码的好处:
使用补码可以没有任何歧义的表示0。
补码可以很好的参与二进制的运算,补码相加符号位参与运算,这样就简单很多了。
浮点数表示
在上图中,我们了解到Float与Double都是支持IEEE 754
我们以float来说明:
IEEE745单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。
一个实数V在IEEE 754标准中可以用V=(-1)s×M×2E 的形式表示,说明如下:
符号位 | 指数位 | 小数位 |
---|---|---|
1位 | 8位 | 23位 |
例如根据IEEE745,计算11000001000100000000000000000000的单精度浮点的值。
解题:
1 | 10000010 | 00100000000000000000000 |
---|---|---|
符号位 | 指数 | 尾数由于指数不是全部为0 所以小数位附加1 |
1 | 10000010 | 1.00100000000000000000000 |
-1 | 2^(130-127) | (2^0 + 2^-3) |
结论:-1 * (2^0 + 2^-3) * 2^(130-127) =-9
同样,你也可以验证一下十进制浮点数0.1的二进制形式是否正确,你会发现,0.1不能表示为有限个二进制位,因此在内存中的表示是舍入(rounding)以后的结果,即 0x3dcccccd, 十进制为0.100000001, 误差0.000000001由此产生了。
进制的概念
我们常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。
二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。
位运算符
按位与(&)
两位全为1,结果才为1:
0&0=0; 0&1=0; 1&0=0; 1&1=1;
用法:
例如:设X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。
按位或(|)
只要有一个为1,结果就为1:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
用法:常用来对一个数据的某些位置1;找到一个数,对应X要置1的位,该数的对应位为1,其余位为零。此数与X相或可使X中的某些位置1。
例如:将X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。
异或运算(^)
*两个相应位为“异”(值不同),则该位结果为1,否则为0: *
0^0=0; 0^1=1; 1^0=1; 1^1=0;
用法:
取反运算(~)
对于一个二进制数按位取反,即将0变1,1变0: ~1=0; ~0=1;
左移运算(<<)
将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补零) 2<<1 = 4 : 10 <<1 =100=4
若左移时舍弃的高位不包括1,则每左移一位,相当于该数乘以2。 -14(二进制:1111 0010)<< 2= (1100 1000) (高位包括1,不符合规则)
右移运算(>>)
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2.
左补0 or 补1 得看被移数是正还是负。
例:4 >> 2 = 1
例:-14(1111 0010) >> 2 = -4 (1111 1100 )
无符号右移运算(>>>)
各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
各个位向右移指定的位数。右移后左边突出的位用零来填充。移出右边的位被丢弃
例如: -14>>>2
即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
=(0011 1111 1111 1111 1111 1111 1111 1100)
= 1073741820
说明:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
计算机系统将二进制地址分配给内存位置。 但是,系统使用位数来寻址内存位置。 使用1位,可以解决两个存储位置。 使用2位,我们可以解决4个问题,使用3个位解决8个存储器位置问题。 可以在地址中的位数与存储器位置的范围之间的映射中识别模式。 我们知道, 这n位可以分成两部分,即K位和(n-k)位。
我在跟踪http://spark.apache.org/docs/latest/sql-programming-guide.html 打字后: 我有一些我没有看到答案的问题。 首先,什么是$符号?如 第二,我能从第二行得到数据吗(我不知道第二行的数据是什么)。 第三,你将如何阅读彩色图像与火花sql? 第四,我仍然不确定数据集和火花中的数据帧有什么区别。变量df是一个数据帧,所以我可以将“Mich
系统环境MAC OS 10.10 MySQL版本,5.7.9 Mac 安装mysql很简单,官网下载安装包,双击安装就可以了,有几个地方需要注意 在Mac下用DMG包新安装mysql,在安装完毕最后一步会随机分配一个root密码,记住密码,安装完毕用root登录,但密码是过期状态,mysql默认情况下密码有效期是360天,需要重新改下,具体请看Password Expiration Policy
本文向大家介绍Lua中使用模块的一些基础知识,包括了Lua中使用模块的一些基础知识的使用技巧和注意事项,需要的朋友参考一下 --两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]]。
2.1 JVM 2.2 IO 2.3 并发编程
本文向大家介绍vue-router相关基础知识及工作原理,包括了vue-router相关基础知识及工作原理的使用技巧和注意事项,需要的朋友参考一下 前言 今天面试被问到 vue的动态路由,我竟然没有回答上来,感觉不是什么难得问题。好久没有看vue-router的文档,很多用的东西和概念没有对上。回来一看什么是动态路由就傻眼了。看来有必要把vue -router相关知识总结一下,好丢人的感觉。 单