沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。你用剑\ud83d\udde1、我用刀\ud83d\udd2a,好的代码都很烧,望你不吝出招!
一、前言介绍
无论在面试过程中还是平时的技术交流中,似乎有很多小伙伴始终记不住java中byte类型的取值范围是多少。究其原因大部分程序员对这个取值范围是不在意的,因为知道与不知道都不影响你完成工作。另外这种知识点压根不是让你死记硬背的,当然如果你是从其他文科专业转过来学编程开发的,还情有可原。但对一个理科生来说,就不太应该了。
二、取值范围计算
在java中,byte占1个字节,8比特位,可以想象成8个小块的数据区间,首位用0、1代表符号位。0[正]、1[负],那么绘制出一个表格如下;
byte
序号87654321
2ⁿ2^72^62^52^42^32^22^12^0
值1286432168421
+127 二进制求和
2^0+2^1+2^2+2^3+2^4+2^5+2^6+2^7 =2^(n+1) -1 =127复制代码
-128 二进制求和
2^8 =128复制代码
好了,现在看懂逻辑就很清晰了,为什么是负数到-128,因为1代表负数的符号位,也就整整好好是2的8次方,-128。
三、进制数值转换
因为java语言与一些其他语言byte的取值范围不同,所以在有时候处理一些文件时候需要进行进制转换。也就是 -128~127 与0~255 的转换处理;
比如我们现在将一个java中byte=120,转换成 0~255取值范围的数值;
一般可以进行与运算;
120 &0x0FF复制代码
同时还可以进行增位运算;(也就是将8个字节长度的内容,放到16个长度中,进行转换)
byte[] val = {-120}; BigInteger bigInteger =new BigInteger(1, val); //有符号 System.out.println(bigInteger.byteValue()); //无符号(增位) String str_hex =