byte,即字节,由8位的二进制组成。在Java中,byte类型的数据是8位带符号的二进制数。
在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。
一直在想为什么不是 -128 到 128呢?今天分析了一下这个问题。
首先我们得明白一件事情,那就是运算规则(因为计算机中的数是以反码形式存储的,反码再求反码得到该数真值):
正数的最高位都是 0 ,正数的值就是二进制表示的值。
负数的最高位都是 1 ,负数的值是 取反后加一 然后加个负号得到得值。
我们用8位的二进制来说明一下此规则:
比如:00000001。最高位是0 为正数 ,那么表示的就是 十进制的 1。
再比如:10000001.最高位是1 为负数,值是多少?取反得到 01111110 加1 得到 01111111 ,那么值为 -127 (可能你会有疑问了?why?-127不是应该是1111 1111,先不急,可以去看下面要说的 反码,你就懂了)
理解此运算规则我们正式开始说byte,byte正好是8位的二进制数。short是16位 int是32位 long是64位。
不难理解,byte的最大正数就是 01111111(最高位必须是0),也就是 127。
那么你可能会想 byte的最小负数就是 11111111 了,对不对? 这么想就
大错特错了。让我们看看11111111这个二进制数表示多少。
根据上面的提示 我们知道这是一个负数。它的值是先取反再加1 。
11111111取反得到:00000000,加1得到 00000001 。最后得到的值为-1.
这可是最大的负数啊。由此你是不是想到了最小的负数会不会是10000000呢?
让我们算一下 取反:01111111 加1得到 10000000 最后得到 -128.
127是01111111 然而 -128是10000000 ,看出来一个奇怪的事情。
仔细的看一下这两个二进制数 是不是前者加1就得到后者呢?对。
可以编一个小程序实验一下:
byte a = 127;
a+=1;
System.out.println(a);
结果正好是-128
由此我们可以看出来二进制从 00000000 到01111111到10000000到 11111111
即 十进制从 0 到 127 到 -128 到 -1。
接下来,我们用一段代码来更深刻地理解byte:
public class A {
public static void main(String[] args) {
int b = 456;
byte test = (byte) b;
System.out.println(test);
}
}
上述代码,最后会输出-56。原因如下:
456的二进制表示是111001000,由于int是32位的二进制,所以在计算机中,实际上是00000000000……111001000,当int转成byte的时候,那么计算机会只保留最后8位,即11001000。
然后11001000的最高位是1,那么表示是一个负数,而负数在计算机中都是以补码的形式保存的,所以我们计算11001000的原码为00111000,即56,所以11001000表示的是-56,所以最后test的值为-56。
java中存储的数据类型均带符号,即看最高位:为0表示正数,为1表示负数
类型 | 字节数 | bit位数 | 取值范围 |
---|---|---|---|
byte | 1 | 8 | -128到127 |
short | 2 | 16 | -215到215-1 |
int | 4 | 32 | -231到231-1 |
long | 8 | 64 | -263到263-1 |
原码:就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值。
反码:在原码的基础上,正数反码就是他本身,负数除符号位之外全部按位取 反。
补码:正数的补码就是自己本身, 负数的补码是在自身反码的基础上加1.
包含: &(与), | (或), ^ (异或),~ (按位取反)
& :当2个都为1的时候为1, 其他都是0 。 1&1 = 1, 1&0 = 0, 0&0 = 0; 他的作用是清0
| : 当2个只要有一个为1,就是1. 1|0 = 1; 0|0 = 0, 1|1 = 1;
^: 相同为0, 不相同为1, 1^0 = 1, 1^1 = 0, 0^0 = 0; 他的作用是定位翻转。
~: 按位取反,0变为1, 1变为0;
之所以要明确原码,反码,补码,是因为java中变量都是以补码的形式保存的。
比如 整行30 他的原码是:0001 1110. 正数,所以反码,补码都是0001 1110.
对于负数:-7 ,他的原码是 1000 0111, 第一位1表示是此数是负数。他的反码是:1111 1000, 补码在反码的基础上加1, 所以它的补码是1111 1001, 所以他的二进制数就是1111 1001.
如“-16+11”的运算:
11110000 + -16的补码
00001011 11的补码
————
11111011 - 5的补码
包含:<<, >>, >>>
<< 表示左移,不分正负数,丢去高位,低位补0,如果移动的位数大于32, 那么就需要取余(例如下方<<10等价于<<2)
注:以下数据类型默认为byte-8位
左移时不管正负,低位补0
正数:r = 20 << 2
20的二进制补码:0001 0100
向左移动两位后:0101 0000
结果:r = 80
负数:r = -20 << 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 ***:*1110 1011
-20 的二进制补码 :1110 1100
左移两位后的补码:1011 0000
反码:1010 1111
原码:1101 0000
结果:r = -80
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1
注:以下数据类型默认为byte-8位
正数:r = 20 >> 2
20的二进制补码:0001 0100
向右移动两位后:0000 0101
结果:r = 5
负数:r = -20 >> 2
-20 的二进制原码 :1001 0100
-20 的二进制反码 :1110 1011
-20 的二进制补码 :1110 1100
右移两位后的补码:1111 1011
反码:1111 1010
原码:1000 0101
结果:r = -5
>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数: r = 20 >>> 2
的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
-20:源码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
下面以unsigned int value = 0x12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char buf[4]来表示value
Big-Endian: 低地址存放高位,如下:
高地址
buf[3] (0x78) – 低位
buf[2] (0x56)
buf[1] (0x34)
buf[0] (0x12) – 高位
低地址
Little-Endian: 低地址存放低位,如下:
高地址
buf[3] (0x12) – 高位
buf[2] (0x34)
buf[1] (0x56)
buf[0] (0x78) – 低位
低地址
内存地址 | 小端模式存放内容 | 大端模式存放内容 |
---|---|---|
0x4000 | 0x78 | 0x12 |
0x4001 | 0x56 | 0x34 |
0x4002 | 0x34 | 0x56 |
0x4003 | 0x12 | 0x78 |
/**
* int到byte[] 由高位到低位
* @param i 需要转换为byte数组的整行值。
* @return byte数组
*/
public static byte[] intToByteArray(int i) {
byte[] result = new byte[4];
result[0] = (byte)((i >> 24) & 0xFF);
result[1] = (byte)((i >> 16) & 0xFF);
result[2] = (byte)((i >> 8) & 0xFF);
result[3] = (byte)(i & 0xFF);
return result;
}
/**
* byte[]转int
* @param bytes 需要转换成int的数组
* @return int值
*/
public static int byteArrayToInt(byte[] bytes) {
int value=0;
for(int i = 0; i < 4; i++) {
int shift= (3-i) * 8;
value +=(bytes[i] & 0xFF) << shift;
}
return value;
}
c语言中数据类型分为有符号数和无符号数,但是在java中只有有符号数,不存在无符号数.所以当我们与硬件人员共同开发项目时,解析协议里面的byte[]要注意跟硬件人员确定是否带符号.带符号就跟java中一样处理即可.不带符号的话就要小心了,如果还按照java常规方法解析可能会越界.所以一般我们在byte[]转int值时,当作byte[]转long处理即可;在int转byte[]时,当作long转byte[],然后截取后4个字节(大端模式转换)
文章浏览阅读1.3w次,点赞3次,收藏3次。金融领域是所有行业发展灵魂。当所有行业有了货币化支持后,才能融资和蓬勃发展。金融行业也不能过度发展,否则社会效率会降低,大家都去追求短期利润,资本大量进入房地产和股票市场,逃离实体经济。这时,风控诞生,风控就像一把紧箍咒,让金融资本更好为社会服务。1.机器学习论文高通过率论文,专利对于同学发展不言而喻。论文不通过,没法毕业,没法毕业就拿不到毕业证,工作也没法找。发表论文数量和质量有利于工作升迁,评职称就需要在核心期刊发布论文。在金融资本时代,诸多论文离不开统计和建模。统计学和机器学习模型可以解决诸多_复现金融学论文
文章浏览阅读955次,点赞16次,收藏24次。MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志binlog(归档日志)和事务日志redo log(重做日志)和undo log(回滚日志)。今天就来聊聊redo log(重做日志)、binlog(归档日志)、两阶段提交、undo log(回滚日志)。MySQL InnoDB 引擎使用redo log(重做日志)保证事务的持久性,使用undo log(回滚日志)来保证事务的原子性。MySQL数据库的数据备份、主备、主主、主从都离不开。_mysql的binlog面试题
文章浏览阅读3.7k次。1.第一个实用的、迄今为止应用最广的公钥密码体制是(A )。A. RSA B.Elgamal C.ECC D.NTRU2.一个密码系统至少由明文、密文、加密算法和解密算法、密钥五部分组成,而其安全性是由( D)决定的。A.加密算法 B.解密算法 C.加密算法和解密算法 D.密钥3.计算和估计出破译密码系统的计算量下限,利用已有的最好方法破译它所需要的代价超出了破译者的破译能力(如时间、空间、资金等资源),那么该密码系统的安全性是( B)。A.无条件安全 B.计算安全 C.可证明安全..._计算和估计出破译密码系统的计算量的方法
文章浏览阅读4.3k次,点赞10次,收藏4次。卢京潮老师视频配套课件自取自取!自动控制原理–卢京潮 2009 完整版西北工业大学 卢京潮教授链接:https://pan.baidu.com/s/1MwB-awndbUe3osBuexYkow提取码:6enwB站同步视频考研首选-自动控制原理(自控)-卢京潮老师_哔哩哔哩_bilibili..._卢京潮自动控制原理ppt
文章浏览阅读645次,点赞17次,收藏5次。git是一个代码版本控制工具,开发人员常用的工具,可以将各个阶段编写的代码提交到远程Git或github仓库中,每个开发人员书写不同的功能,最后使用Git命令将各个功能进行集合,有助于多人协作,提高了开发效率,并且,上传的代码,还可以进行拉取,覆盖到本地,相当于恢复快照功能。
文章浏览阅读1.7k次,点赞2次,收藏4次。(1)为什么要做客户运营一个公司有N位CXO:1、营销服务卖给:CMO2、交易服务卖给:CEO3、上市/融资/金融信贷/财税服务卖给:CFO4、人力服务卖给:CHO5、I..._自动化公司笑话
文章浏览阅读1.8k次。推荐多样性的衡量指标是单个推荐列表中物品之间的差异程度,通过计算在同一个推荐 list 中两两 Item 之间的相似度的平均值来进行衡量。DPP(Determinantal Point Process)行列式点过程,是一种性能较高的概率模型。将复杂的概率计算转换成简单的行列式计算,通过核矩阵的行列式计算每一个自己的概率。..._行列式点过程dpp改进
文章浏览阅读1.5k次。在SSMS中会有两种函数:内置函数,用户自定义函数。内置函数,如max(),min()用户自定函数是自己编写的函数,分为标量函数,表函数先介绍一下标量函数范例:1.创建标量函数create function Greatest(@v1 float, @v2 float, @v3 float) RETURNS floatASBEGIN declare @ret float; set @ret=@v1; if @ret<@v2 begin set @ret=@v2 _ssms内置函数
文章浏览阅读2.3k次,点赞9次,收藏5次。Java可视化 No operations allowed after connection closed自己做java可视化没有出现这个问题,但是发现不少同学都出现这个问题了,简单概述一下这个问题解决方案,造成原因还没理解通透。以上是截取的控制台报错片段,翻译成中国人能懂的语言就是在数据库连接关闭后操作不被允许但是在经过不懈努力后,甚至给他一个全新链接之后,他依然会报错,真的脑袋疼查阅了众多csdn博客,要不就是要求改啥springboot的配置文件,要不设置MySQL链接休眠时间啥的首先我_no operations allowed after connection closed
文章浏览阅读551次。算法笔记@Ada_Lake算法笔记–2.3小节算法笔记代码保留地~~~2.3小节——C/C++快速入门-&amp;amp;amp;amp;amp;amp;gt;选择结构问题 A: 例题4-1 一元二次方程求根题目描述 ,求一元二次方程ax2+bx+c=0的根,三个系数a, b, c由键盘输入,且a不能为0,但不保证b2-4ac&amp;amp;amp;amp;amp;amp;gt;0。程序中所涉及的变量均为double类型。输入,以空格分隔的一元二次方程的三个系_输入3个整,求输出其中的最大数和最小数,换行输出两个数。
文章浏览阅读1.5k次。资料显示,飞行器质心对飞行安全会产生很大影响,因为设备布置问题,飞行器油箱一般分散布置在机身各处[1-2]。携带有多个油箱的飞行器在飞行过程中,通过若干个油箱联合供油以同时满足飞行任务要求和发动机工作需求。各个油箱内油量的分布和供油策略将导致飞行器质心变化,进而影响对飞行器的控制。统计资料显示,大多数此类飞行器在日常工作中都存在燃油消耗不平衡的现象[3],因此,需要制定利于飞行器控制的各油箱的供油策略。飞行器的结构(如油箱的位置、形状、尺寸、供油关系、供油速度限制等)影响油箱。_华为杯论文
文章浏览阅读3.1k次,点赞2次,收藏2次。最近日子一直在做控制方面的事情,后面日子逐步打算将树莓派应用到船舶动力系统的智能控制中(预测控制,动态规划,深度强化学习等等)。今日这篇讲解树莓派安装tensorflow的事情,踏着一路坑过来,,,心累。。。首先讲几个重点:1. 最好不要下载最新的树莓派系统,老一点好,这样树莓派里面自带的python3.x版本会比较低(python3.4+就行),当然你也可以自己卸载重新安装,不过坑真的很多哈。一..._树莓派系统支持py2.7