关于JAVA中Byte数据类型二进制赋值运算报错问题
自从JDK7更新之后,新增了二进制变量的表示,支持将整数类型用二进制来表示,用0b开头;
例如: byte b= (byte) 0b1000_0001;
short s = (short) 0b1000_0000_0000_0001;
新手在这个时候会遇到一个问题,为啥byte b=0b100_00001会报错(cannot convert from int to byte)
而short b=0b100_00001又不会呢?既然java底层默认0b100_00001是int类型,为什么short可以呢?
有的人说是byte是字节数据类型,short是短整数据类型,个人认为不太准确。所以我们在做个试验:
试验1:short b=0b100_00001;//正常赋值;
short s=0b1000_0000_0000_0001;//系统报错(cannot convert from int to byte);
这个结果出来想必大家都有些眉目了,在二进制中最高位被定义为符号位,byte共有8个比特位,我们给它
0b000_0001时,最高位系统无法判断是 实际数值 还是 符号位数值 。如果我们加上(byte),则系统认为
此时的0是符号位,可以赋值;如果没有加(byte),则认为是实际数值,然而byte类型只有8个比特位,无位置
表示符号位,因此溢出报错。
试验2:byte b=0b0000_0001;// 正常赋值
byte b=0b1000_0000;//报错
再次印证了上面的推理,默认最高位是实际数值,超出位宽报错。
-----------------------------------------------------------------黄金分割线---------------------------------------------------------------------
问题2:
byte a=(byte)0b1111_1111+0b0000_0001; ---> 0 //运行结果为0
有人解释道0b0000_0001为int类型,而(byte)0b1111_1111为byte类型,运算时会转为int类型运算,即为:
0000_0000_0000_0000_0000_0000_1111_1111
+
0000_0000_0000_0000_0000_0000_0000_0001
||
0000_0000_0000_0000_0000_0001_0000_0000
|| 转为byte类型,直接截取后8位
0000_0000 = 0
那么又有人问了:
int a=(byte)0b1111_1111+0b0000_0001; 0 //运行结果同样为0,为什么不是256
按照上面的意思被赋值变量a属于int类型,既然是按照int类型运算,结果就不用转换了嘛,直接赋值不就行啦?
我们在看几组试验:
1 、 byte a=(byte)0b0000_0001+0b1111_1111; -->报错 //cannot convert from int to byte
int a=(byte)0b0000_0001+0b1111_1111; -->256 正常赋值
2 、 byte a=(byte)0b1111_1111+(byte)0b0000_0001; --> 0
int a=(byte)0b1111_1111+(byte)0b0000_0001; --> 0
3、 byte a=(byte)(0b1111_1111+0b0000_0001); --> 0
int a=(byte)(0b1111_1111+0b0000_0001); --> 0
4、 int a=0b1111_1111+0b0000_0001; --> 256
第一组报错从第一个问题可以推出,0b1111_1111超出了等号左边的byte类型范围,所以才会报错。
我们有三种推断:
第一、如果是都转为byte类型进行运算,那会考虑到符号位,多余正溢出,超出位宽自然舍弃,相加结果应为0b1000_0000,结果应为-128才对
显然结果不是这样的,因此这种推断错误;
第二、如果是都转为int类型进行运算,然后把值赋值给等号左边,这种推论试验2中int a=0,说不通,因此这种推断错误;
第三、运算按照java直接值得规则,数值类型进行算数运算时,所有参与算数运算的数都会自动转换为参与运算的最大类型,得到的值也是该类型
我们一一验证补码运算的结果{(byte)0b1111_1111对应的原码为1000_0001即为-1,而0000_0001位1,相加结果为0},以上问题都可以推理出来,
因此,第三种推论是正确的,打完收工。
关于JAVA中Byte数据类型二进制赋值运算报错问题的更多相关文章
- Java中Byte类型数据在运算中的问题
比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...
- Java中float浮点型变量不加F报错情况
1 public class Text { 2 3 public static void main(String args[] ){ 4 float x=123.45; 5 System.out.pr ...
- java中byte数组,二进制binary安装chunk大小读取数据
int CHUNKED_SIZE = 8000; public void recognizeText(byte[] data) throws InterruptedException, IOExcep ...
- Java中List集合转Map集合报错:Duplicate key
一.问题由来 最近生成环境刚发布了一个版本,本人负责优化的一个功能在进行测试时,报错了一个异常,duplicate key;去百度里面看了一下, 意思很明确就是建重复,而且错误是在Java代码中抛出来 ...
- Java中的List转换成JSON报错(五)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanu ...
- Java中的List转换成JSON报错(四)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/colle ...
- Java中的List转换成JSON报错(三)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...
- Java中的List转换成JSON报错(二)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/loggi ...
- Java中的List转换成JSON报错(一)
1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/ ...
随机推荐
- Mac 安装 mysqlclient
尝试在虚拟环境下通过 pip 安装: pip install mysqlclient 然后报错:OSError: mysql_config not found 找到官方文档 https://githu ...
- 下载azure website的code
1.登陆kudu直接下载. http://www.concurrency.com/blog/use-azure-kudu-debug-azure-websites/ 2.FTP链接拷贝(可以忽略) 3 ...
- Centos文章列表
1.Linux 中将用户添加到组的指令:https://cnzhx.net/blog/linux-add-user-to-group/ 2.CentOS7为firewalld添加开放端口及相关操作:h ...
- Andriod ListView组件的使用
1.介绍 总结:ListView 是一个可以以垂直滚动的方式展示条目内容的一个列表,条目的内容来自于ListAdapter(适配器). 2.操作步骤 3.内存溢出问题(快速拖到条目) 利用getVie ...
- Android 基于TCP多线程通信实现群聊天的功能
1.TCP多线程原理图 2.实现方法 (1)服务器端 (2)客户端 3.java后台代码 主界面 package com.lucky.test50socket2; import android.ann ...
- liunx 请求服务器连接数相关设置
一. 文件数限制修改 1.用户级别 修改 nr_open 限制 (用途:能够配置nofile最大数) cat /proc/sys/fs/nr_open Linux 内核 2.6.25 以前,在内核里面 ...
- [WC2008]游览计划(斯坦纳树)
[Luogu4294] 题解 : 斯坦纳树 \(dp[i][j]\) 表示以\(i\)号节点为根,当前状态为\(j\)(与\(i\)连通的点为\(1\)) 当根\(i\)不改变时状态转移方程是: \( ...
- POJ1475 Pushing Boxes 华丽丽的双重BFS
woc累死了写了两个半小时...就是BFS?我太菜了... 刚开始以为让人预先跑一遍BFS,然后一会儿取两节加起来就好了,结果发现求出来的最短路(就是这个意思)会因箱子的移动而变化....我死了QWQ ...
- vue控制父子组件渲染顺序
在父组件中,如下图渲染子组件,那如何在父组件中加入一些数据获取逻辑且能控制子组件渲染呢. 就是像在上图中红框圈起来的那样,挂个 ok(其他你自己定义的也可以) 参数,同时在父组件的任何生命周期中去改变 ...
- computed 和 watch 组合使用,监听数据全局数据状态
我要实现的就是,当接口返回数据时,我在任何组件中都能感知到到该数据的变化,然后根据业务逻辑进行处理.展示. 实现这个效果的方式很多,比如当接口返回数据后,就emit这数据,在另外组件中on接收渲染即可 ...