自从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数据类型二进制赋值运算报错问题的更多相关文章

  1. Java中Byte类型数据在运算中的问题

    比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...

  2. Java中float浮点型变量不加F报错情况

    1 public class Text { 2 3 public static void main(String args[] ){ 4 float x=123.45; 5 System.out.pr ...

  3. java中byte数组,二进制binary安装chunk大小读取数据

    int CHUNKED_SIZE = 8000; public void recognizeText(byte[] data) throws InterruptedException, IOExcep ...

  4. Java中List集合转Map集合报错:Duplicate key

    一.问题由来 最近生成环境刚发布了一个版本,本人负责优化的一个功能在进行测试时,报错了一个异常,duplicate key;去百度里面看了一下, 意思很明确就是建重复,而且错误是在Java代码中抛出来 ...

  5. Java中的List转换成JSON报错(五)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/beanu ...

  6. Java中的List转换成JSON报错(四)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/colle ...

  7. Java中的List转换成JSON报错(三)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher a ...

  8. Java中的List转换成JSON报错(二)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/loggi ...

  9. Java中的List转换成JSON报错(一)

    1.错误描述 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang/ ...

随机推荐

  1. selenium面试题

    selenium中如何判断元素是否存在? selenium中没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素+异常捕获的方式判断. # 判断元素是否存在 try: dr.find_elem ...

  2. IO相关3(string流)

    sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO 流一样. istringstream 从 s ...

  3. Python3之Memcache使用

    简介 Memcached是一个高性能的分布式内存对象缓存系统,用于动态WEB应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态,数据库网站的速度.Memcached ...

  4. Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

    Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划) 题目描述 已知一个正方形二维数组A,我们想找到一条最小下降路径的和 所谓下降路径是指,从一行到 ...

  5. JUC包下Semaphore学习笔记

    在Java的并发包中,Semaphore类表示信号量.Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理.Semaphore有两个构造函数,参数 ...

  6. 使用Jenkins进行Android自动打包,自定义版本号等信息【转】

    之前App在提交测试和最终部署的过程中App打包一直是由开发人员来完成的,由于项目比较大, 再加上Android打包本身就比较慢,所以每次打包还是很耗时的.并且按照严格的研发流程来讲,开发人员应该只负 ...

  7. String Reduction问题分析

    问题描述: Given a string consisting of a,b and c's, we can perform the following operation: Take any two ...

  8. Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement

    原因: 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的.由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到targe ...

  9. Android与MVC设计模式

    写在前面,之前做过一段时间移动开发,后来因为工作原因搁浅了,最新重新拿起Android权威编程指南学习,顺道做个学习笔记. 首先呢,我想说无论是计算机科班出身还是培训班出身,都听说过高内聚低耦合以及M ...

  10. ASP.NET中MD5的加密方式很简单

    在ASP.NET中MD5的加密方式很简单,代码如下: FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5&quo ...