Java基本数据类型与位运算、原码&补码&反码
来源:互联网 发布:斗鱼直播for mac 编辑:程序博客网 时间:2024/05/22 17:21
一、Java中的基本数据类型
平日里开发过程中,总是会遇到基本数据类型在内存中占几个字节的类似疑问,一直想把这些基础的知识整理一下,总是偷懒,于是今天便总结了一下,如果下面的文章哪里有问题,欢迎在评论中留言指出:
Java中有8种基本数据类型,分别是byte,short,int,long,char,float,double,boolean型数据,其在内存中占据字节数,取值范围如图:
这里针对char、float与double类型的取值范围还要补充一下:
①Character.MIN_VALUE = ’ \u0000’; Character.MAX_VALUE = ‘\uFFFF’;而在Java中\u开头的是一个Unicode码的字符,Unicode字符通常用十六进制编码方案表示,范围在’\u0000’到’\uFFFF’之间。\u0000代表的应该是NULL,输出控制台是一个空格。而具体关于Java中Unicode的理解请参考Java中Unicode的编码和实现
②Float.MIN_VALUE = 1.4E-45(2^(-149));
Float.MAX_VALUE = 3.4028235E38((2-2^(-23))*2^127 );数值后面一般有一个F或者f,比如3.1435f
Double.MIN_VALUE = 4.9E-324;
Double.MAX_VALUE = 1.7976931348623157E308;数值后面什么都不标,默认是double类型的;
具体解释请参阅Java中float/double取值范围与精度
关于java中浮点数据的研究,请参阅基础野:细说浮点数
二、Java中的原码&反码&原码
计算机中的数据都是以二进制流的方式来存储,整数的表达:
原码:第一位为符号位(0为正数,1为负数)
反码:符号位不动,原码取反。
负数补码:符号位不动,反码加一。
正数补码:和原码相同。
比如我们用byte类型的5、-1、-6、0来举例:
5的原码:00000101
5的反码:01111010
5的补码:00000101
负数的表示:
-1的原码:10000001 -6的原码:10000110
-1的反码:11111110 -6的反码:11111001
-1的补码:11111111 -6的补码:11111010
0的表示:
0的原码:00000000 负数0的原码:10000000
0的反码:01111111 负数0的反码:11111111
0的补码:00000000 负数0的补码:00000000
在计算机系统中,数值一律用补码来表示和存储。原因如下:
- 使用补码,可以将符号位和数值域统一处理
- 加法和减法也可以统一处理
- 原码与补码相互转换,其运算过程是相同的,不需要额外的硬件电路。
同时补码的特性:
- 一个负整数(或原码)与其补数(或补码)相加,和为模。
- 对一个整数的补码再求补码,等于该整数自身。
- 补码的正零与负零表示方法相同。
三、Java中的左移、右移、无符号右移
- 左移:<<,有符号的移位操作,左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充。
- 右移:>>,有符号的移位操作,右移操作时将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是整数用0补充,负数用1补充;
- 无符号右移:>>>,无符号的移位操作,无符号右移操作时将运算数的二进制码整体右移指定位数,右移之后的空位用0补充。
比如3<<2,byte类型的数字3转化为二进制,0000-0011,向左移两位,最右边两位用0补齐,其结果为12;相当于3*2^2,就是乘以2的移动的位数次幂。
3<<2移动之前: 0000-0011
3<<2移动过程:0000-001100,后面的两位补0
3<<2移动之后: 0000-1100
例:6>>2,byte类型的数字6转化为二进制00000110,向右移动两位,最左边空出的两位,用0补齐,结果为1,相当于6/4,只取整数,舍弃小数;就是除以2的移动的位数次幂。
6>>2移动之前:0000-0110
6>>2移动过程:0000-000110
6>>2移动之后:0000-0001
例:-6>>2,byte类型的数字-6转化为二进制10000110,向右移动两位,最左边空出的两位,用1补齐,结果为-2;这里注意,负数在右移的过程中,首先要转化为补码
-6>>2移动之前:1000-0110,求其补码:11111010
-6>>2移动过程: 1111-111010
-6>>2移动之后:1111-1110,负数的补码求原码1000-0010
例:-6>>>2,因为6>>>2移位的过程与6>>2相似,这里不再做过多描述,byte类型的数字-6转化为二进制10000110,当-6无符号向右移动两位,首先转化为其补码,最左边空出的两位,用0补齐;然后在转化为原码,其结果为00111110;
-6>>>2移动之前:1000-0110,求其补码:11111010
-6>>>2移动过程: 0011-111010
-6>>>2移动之后:0011-1110,其为正数,即为原码
- Java基本数据类型与位运算、原码&补码&反码
- 原码,补码,反码与位运算
- Java二进制,原码、反码、补码、位运算
- 位运算和原码,反码,补码
- 【Java基础】八种基本数据类型--原码反码补码
- 原码 反码 补码 数据类型转换 位运算符 位移运算符
- java 二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
- java 二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
- java的原码,反码与补码
- 位运算详解(原码<-->反码<-->补码)
- PHP中位运算及原码,反码和补码
- 二进制(原码,反码,补码),位运算原则:
- 原码补码反码以及位运算符
- 位运算——原码反码补码
- C语言之位运算/原码/反码/补码
- c语言的原码补码反码-位运算
- 原码 反码 补码 及 python的位运算
- 学习TP框架(二)
- SSH学习笔记
- HZAU校赛补题PA(动态规划)
- Java异常处理、异常处理使用的一些注意点(例如,基类和子类捕获的顺序问题)
- 扩展欧几里德 求最小整数解 a,b,c可以为负数
- Java基本数据类型与位运算、原码&补码&反码
- iOS TextField Placeholder设置颜色
- Maven实战之安装和使用
- [数据结构]快速排序
- [摘抄-Socket-学习中]UDP通信基础代码-server端
- HDU4771 Stealing Harry Potter's Precious(状态压缩+广搜BFS)
- qt5.8中的ico文图标件设置
- php模糊查询--正则表达式
- Node.js简介