今天,魏屌出了一道题,题目如下:

定义一个大头序的byte[]a={-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少?

乍一看,这题不难,无非就是移位操作,再进行组合。但是呢?对于用Java的童鞋来说,这里面有一个坑,稍不注意可能就踩进去了。在说之前,我先把代码和答案贴出来吧。

看到这里,可能有的童鞋比较奇怪,为啥要&0xff,这不相当于没变化吗?非也,不信我举个例子。

答案是-127和129。很奇怪不是吗?我想的明明都是-127啊!!!

解答这个问题之前,我们先注意一下,b1的类型是int,而不是byte,这是因为byte的任何计算操作之后,都默认转成int,先明确这个概念。

然后,重头戏来了,大学计算机组成原理我们都学过原码,反码和补码,概念问题这里就不说了,也不用想书本上那些定义,学以致用嘛,一张图说明问题。

是不是很easy?这里再强调一个问题,就是Java中只有有符号数!Java中只有有符号数!Java中只有有符号数!重要的事情说三遍!

那么好了,Java中的数值存储就像这个大圆盘!

我们接着看为什么输出129?已知byte经过计算之后会变成int,但是人家int是32位的啊,byte才8位,所以只能补位啦,诶呀,问题来啦,怎么补位呢?这也是今天想强调的哦!

b是byte类型,其计算机存储的补码是10000001(8位)。

转成int后,Java中的扩展方式是补符号位扩展,何谓补符号位扩展?就是变成了11111111 11111111 11111111 10000001(32位),为啥要这样变?因为这样变还是-127,数值大小没有变!

而我们如果&0xff呢? b&0xff=11111111 11111111 11111111 10000001&11111111=00000000 00000000 00000000 10000001,这个值就是129,这就是补零扩展啦!所以129的问题解决啦!

什么?你问补零扩展有什么用?我们回到魏屌的那道题,两个byte合成一个short,short可是16位哦,如果我们不&0xff,即写成

s[1] = (short)((bs[2] << 8) | bs[3]);

输出结果发现变成了-4。为什么呢?

还是刚才那个思路啊,bs[2]是-3,即11111101,bs[3]是-4,即11111100,

(bs[2] << 8)就变成了11111111 11111111 11111101 00000000,

((bs[2] << 8) | bs[3])就变成了11111111 11111111 11111101 00000000 | 11111111 11111111 11111111 11111100 = 11111111 11111111 11111111 11111100,

再转成short,就是11111111 11111100,结果就是-4啦!就酱紫!

所以Java中byte和short互相转换的代码应该是:

//short转byte

short x = -32752;//定义一个short

byte high = (byte) (0xFF & (x>>8));//定义第一个byte

byte low = (byte) (0xFF & x);//定义第二个byte

System.out.println(high);//打印第一个byte值

System.out.println(low);//打印第二个byte值//byte转short

short z = (short)(((high & 0xFF) << 8) | (0xFF &low));

System.out.println(z);//输出的结果就是-32752

最后总结一下:

因为Java中只有有符号数,当byte扩展到short, int时,即正数都一样,因为符号位是0,所以无论如何都是补零扩展;但负数补零扩展和按符号位扩展结果完全不同。

补符号数,原数值不变。

补零时,相当于把有符号数看成无符号数,比如-127 = 0x81,看成无符号数就是129, 256 + (- 127)。

对于有符号数,从小扩展大时,需要用&0xff这样方式来确保是按补零扩展。

而从大向小处理,符号位自动无效,所以不用处理。

在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展相关推荐

  1. java什么是适配器类?作用是什么?_浅谈Java适配器模式

    假期刚结束不久,也没什么好写的,今天就水下文章,讲讲设计模式对开发时的影响,做开发到现在,感觉设计模式对开发的影响还是挺大的. 这次就简单谈谈适配器模式.可能适配器模式感觉比较鸡肋,但是用到的地方还挺 ...

  2. java语言与其他语言的区别是_浅谈Java语言和其他语言的区别

    计算机语言中,各种语言都有自己的优势与劣势.本人是在大学期间就学习Java的,听到了过多Java不好的地方,但是Java在近20年里何以独步天下呢?Java语言和其他的语言之间到底有什么区别呢? 学习 ...

  3. java gc 可以对方法区进行回收_浅谈 Java 之 GC

    阅读本文假设你对java内存模型已有一些了解. 1.Java虚拟机中哪些内存需要回收? 先来看看jvm内存模型,如下图 线程隔离的区域随线程而生,随线程而灭:程序计数器可保存着虚拟机字节码指令的地址( ...

  4. java字符串常量存哪里_浅谈JAVA中字符串常量的储存位置

    在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分:该部分内容可以结合:JVM简介(更加详细深入的介绍) 1.栈区:由编 ...

  5. java 常量放在哪里_浅谈JAVA中字符串常量的储存位置

    在讲述这些之前我们需要一些预备知识: Java的内存结构我们可以通过两个方面去看待它. 从该角度看的话Java内存结构包含以下部分: 1.栈区:由编译器自动分配释放,具体方法执行结束后,系统自动释放J ...

  6. java 中的单元测试_浅谈Java 中的单元测试

    单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...

  7. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  8. java中修饰常量的事_浅谈java中的声明常量为什么要用static修饰

    今天定义一个类常量,想着也只有这个类可以用到,就没用static关键字修饰.结果sonar代码检查提示: Rename this field "PERSON_TYPE_USER" ...

  9. scale和java比较_浅谈java中BigDecimal的equals与compareTo的区别

    这两天在处理支付金额校验的时候出现了点问题,有个金额比较我用了BigDecimal的equals方法来比较两个金额是否相等,结果导致金额比较出现错误(比如3.0与3.00的比较等). [注:以下所讲都 ...

最新文章

  1. python搜题程序_智慧树Python程序设计基础搜题公众号
  2. 北交大计算机学院教授,北京交通大学计算机与信息技术学院研究生导师:鲁凌云...
  3. 通过自动缩放Kinesis流实时传输数据
  4. 操作系统实验读者写者程序源码_SAST Weekly | STM32F103系列开发板移植华为LiteOS操作系统...
  5. sap生产工单报工_SAP系统PP (ProductionPlanning) 模块知识培训
  6. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
  7. kafka 脚本发送_Apache-Flink深度解析-DataStream-Connectors之Kafka
  8. wechat 微信ipad协议GO版本 最新不封号 长链接 完整版
  9. 集线器和交换机的区别
  10. 计算机辅助教学属于多媒体技术应用吗,多媒体技术在计算机辅助教学中的应用...
  11. 获取pc微信信息_如何获取有关您的PC的详细信息
  12. Oracle一次性查询超过1000条数据的方法(分批查询)
  13. iOS - 解决Warning: Attempt to present which is already presenting
  14. gem devise配置
  15. 为什么要认真准备Java面试,编程语言排行榜告诉你
  16. git fatal: detected dubious ownership in repository
  17. MAL-PEG-NH2,马来酰亚胺-PEG-胺|mal修饰Fe3O4活化磁珠200-300nm|mal修饰SiO2@Fe3O4磁珠200-300nm齐岳生物供应
  18. MyBatis-Plus分页查询where后面的参数拼接错误报### The error occurred while setting parameters
  19. 游戏地图和星际争霸地图技术
  20. 烟草物流信息综合管理平台研究与应用——以H市卷烟厂烟草物流配送中心为例

热门文章

  1. Arrays.hashCode(Object [])与Objects.hash(Object…)
  2. lambda java_Java Lambdas简介
  3. jclouds_jclouds的命令行界面
  4. String#repeat来到Java吗?
  5. java内存模型概述_Java内存模型-快速概述和注意事项
  6. Neo4j:使用Cypher生成实时建议
  7. 基于Spring Boot的WebSocket应用程序并捕获HTTP会话ID
  8. 一个罐子统治一切:Apache TomEE + Shrinkwrap == JavaEE引导
  9. 在JBoss Fuse / Fabric8 / Karaf中使用Byteman
  10. JSR 303从I18N属性文件加载消息