java中byte与int的转换原理

article/2025/10/9 0:47:55

前些天遇到一个问题,byte[0] = "A3"(十六进制表示) 但是在debug时显示的是 -93 ,而如果直接赋值给int的变量也是-93.当然大部分人都知道这是不能直接赋值的,需要以下面的这种方式将byte转换成int:

int temp = byte[0] & 0xFF;
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

因为以前没有做过直接的byte数据的转换,前几天需要判断前两位的byte为"A3" "xx"作为一种类型的判断,才发现好像对这种计算机内部基本类型byte,int的二进制存储和计算不明白原理, 今天就将这部分的理解记录下来。

我们分几个步骤记录这部分知识

  1. byte 十六进制的 “A3” 为什么会显示是 -93
  2. &运算符的计算原理
  3. byte & 0xFF的运算过程以及为什么要这个运算后才赋值给int类型的变量

1. “A3”  —>    -93

首先byte类型是8 bit (8个0/1) , "A3"  --> 1010 0011 ,  jvm虚拟机内部存储的是int类型(4字节 32bit)时是直接将最高位(就是最左边)的值补到高位的24bit, 于是“A3”  --> 1111 1111 1111  1111 1111 1111 1010 0011 (这里是将最高位的1 补到24bit高位).这个二进制表示是计算机内部存储地表示,而计算机内部是以补码的方式存储地,也就是说这个不是真正的值,只有将这个转换成原码才是真正的值。

简单说明一下原码,反码,补码。 正整数的原码,反,补码都是一样的,不用进行转换。负整数的原码,最高位时1,这个不变,将除最高位意外的全部取反,1变成0 ,0变成1,就是反码了,然后将反码+1(以二进制的形式计算)得到的就是补码。那么从补码返回到原码就是先-1,然后将除最高位以外的都取反得到原码。

补码: 1111 1111 1111  1111 1111 1111 1010 0011    —>   -1

反码: 1111 1111 1111  1111 1111 1111 1010 0010    —>  除最高位  全取反

原码 :1000 0000 0000 0000 0000 0000 0101 1101   ——> -(64+16+8+4+1) = -93

这就是为什么“A3”的byte直接赋值给int后会是 -93的原因。

而我们经过之前的分析会发现,当byte的最高位为1时,也就是以上的情况时,byte的值就会从正整数变为负整数了自然也就是错了。当byte的最高位为0时,因为byte存储时补齐24bit高位时用的是0补了24个0 值也就没有变,数值也就是正常的。

2. &运算符  | 运算符

& 这个其实也比较的简单:

1 & 1  --> 1

(1 & 0)  (0 & 1)  (0 & 0)  --> 0

也就是说只有1 & 1 时候才为1 只要有0 结果都是0

| 这个就相反的了

0 | 0 --> 0

(1 & 0)  (0 & 1)  (1 & 1)  --> 1

也就是说只有0 & 0 时候才为0 只要有1 结果都是1

3. &0xFF的意义

其实到了这个时候,我们都明白就是要将 当byte最高位为1时,补的24bit高位的1转换成0 那么值就是正确的。而&0xFF(这是个int类型的值 )这个操作就是起到这个作用(0xFF -->  0000 0000 0000 0000 0000 0000 1111 1111)(谢谢 评论里的回复):

1111 1111 1111  1111 1111 1111 1010 0011 

&

0000 0000 0000 0000 0000 0000 1111 1111

这个的计算结果就是 24bit高位全部为0 ,而8bit低位保持原样。

嗯,byte 转成 int 就完了。

还有一个int 转换成 byte的情况,不过呢因为byte只有8bit因此需要byte[4]数组存储这个int,我就记录一下:

int temp = 1009020;
byte[0] = (byte)(temp >> 24 & 0xFF);
byte[1] = (byte)(temp >> 16 & 0xFF);
byte[3] = (byte)(temp >> 8 & 0xFF);
byte[4] = (byte)(temp  & 0xFF);
//0为高位 2,3,4依次为低位

原理其实就是将32bit , 以8bit为一段分割了一下, 也就是 >> 8( 倍数)移位了一下,然后其他就如之前一样。

记录一下几个重要的点

  • 计算机内部存储时是以补码的形式存储,如果是负整数,需要转换
  • jvm虚拟机存储byte类型值是以4个字节存的,也就是会在24bit高位补byte最高位的值
  • &运算符的规则

 


http://chatgpt.dhexx.cn/article/05WKPuLS.shtml

相关文章

Java byte 转化为 String

1、Java 中 byte 转化为 String,代码如下 package nice.com.mian;import java.io.UnsupportedEncodingException;public class StringMain {public static void main(String[] args) throws Exception {byte[] bb {97,99,105,51,55};String str new String(bb, &…

Java byte[] 转 String的简单转换

简单的将byte[] 还原成了 String 值 [TOC] 代码: public class Test0719 {public static void main(String[] args) {String text "test";byte[] textBytes text.getBytes();String content byteToString(textBytes);System.out.println(textBytes &q…

java:int强制类型转换成byte

注:非常感谢评论的最佳戏子大佬指出了我的不足,已经进行修改 int强制类型转换成byte 一、基础知识二、int->byte方法一方法二 一、基础知识 int 在java中是32位, byte是8位 原码:就是二进制码,最高位为符号位&…

C#初级编程

Unity学习笔记——C#初级编程 一、Awake 和 Start二、Update 和 FixedUpdate三、启用和禁用组件四、SetActive、Active Self、Active in Hierarchy五、位置和旋转六、transform.lookAt(Transform target)七、线性插值八、Destroy九、GetButton 和 GetKey十、GetAxis十一、GetCo…

零基础怎样自学编程?新手如何学习编程?编程学习入门指南

对于编程,很多新手的第一感觉可能就是: 高深,难学。 学好编程,有的时候,可以把一些需要我们重复劳动的工作,自动化批量处理,为我们节省很多时间和精力。 对于一些学得比较深入的朋友来说&…

新手学计算机编程怎么入门 从哪学起

近些年有一种职业发展很快、人才需求量大、工资高,那就是程序员。他们的基本工作就是电脑编程,开发者各种各样的软件、APP,被很多人膜拜。如果你想成为一名程序员,有必要了解一下这些基本的电脑编程入门教程。 1计算机编程怎么入门…

代码编程教学入门

前言 代码编程是我们在现代能获得的最宝贵的技能之一,学会写代码不仅让我们在职业前景上更得心应手,而且还能让我们的大脑保持活跃和创造性,甚至我们还有机会创造出一些 awesome 的东西出来。 如果我们才刚刚开始(或准备开始&am…

20道经典C语言编程题(初级)

编者按:以下20道题目为自己练习所写的代码,均已提交检测通过,其中有些题也许有更优的解法,所以写的不好望读者包涵,由于个人练习,所以没有写注释,有什么问题的地方,可以留言一起交流…

沈师 PTA 数据库题目及部分解析 第四章

判断题 1.在数据库安全性控制中,所有授予出去的权力在必要时都可以用REVOKE语句收回。 T 2.用户可以“自主”地决定将数据的存取权限授予何人、决定是否也将“授权”的权限授予别人,因此称这样的存取控制是自主存取控制。 T 3.数据库的安全性是指保护数据…

编程题目+数据库题目总结(3)

目录 编程题1.字典中保存了一些股票代码(键)及价格(值),用一行代码找出价格最高的股票,输出股票代码。(5分)2.字典中保存了一些股票代码(键)及价格(值&#x…

沈师 PTA 数据库题目及部分解析 第一章

判断题: 1.一个数据库只有一个模式和一个内模式。 T 2.数据模型是由数据结构、数据操作和完整性约束三部分组成的 T 3.由于数据库中的数据是不断更新的,因此关系模式是相对变化的。 F 解析:关系模式不会相对变化,变化的是实例 4.数…

【数据库题目复习】期末试卷 一、二

文章目录 试题一一、选择题二、填空题三、简答题四、设计题五、综合题 试题二一、选择题二、填空题三、简答题四、设计题五、综合题 试题一 一、选择题 1. 数据库系统的核心是( B ) A.数据库 B.数据库管理系统 C&#xf…

【数据库题目复习】第7章 数据库设计

文章目录 一、选择题:二、填空三、应用 参考文章:https://blog.csdn.net/qq_46139801/article/details/117453449 知识点: (1)各子系统的E-R图之间的冲突主要有三类: 属性冲突、命名冲突和结构冲突。 &…

【力扣刷题总结】数据库题目按知识点分类总结

观前提示: 这个图先自行背诵至滚瓜烂熟。 文档中论述题目解题思路时没有特殊情况都按照上面的程序执行顺序为准,个别题也会以其他更自然的顺序讲解。 本文的知识点整理仅起提示作用,一些不常用功能、参数可能会遗漏,如需了解详细…

数据库题目之数据库设计

一、选择题 1、在数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它是数据库设计的 阶段。 A.需求分析 B.概念设计 C.逻辑设计 D.物理设计 【答案:】B 2、在关系…

数据库常考大题

宝子们心心念念的数据库大题来啦~ 我已经整理好啦~你们根据目录找对应题目就好啦,嘿嘿~姐姐是不是还有点小贴心呢? 🛸 🌏 🌘 • . ✯✯ ★ * 🛰 . • ★ • ▁▂▃▄▅▆▇▇▆▅▄▃▁▂▃. 目录…

33道数据库题目

33道数据库题目 准备三张表题目 准备三张表 emp–员工表 dept–部门表 salgrade–工资等级表 题目 取得每个部门最高薪水的人员名称 (方法1) select ename, sal, deptno from emp where sal in (select max(sal) from emp group by deptno);(方法2) select e.…

50道数据库SQL练习题(深入理解各关键字的作用)

目录 表结构创建表练习题1、查询“001”课程比“002”课程成绩高的所有学生的学号2、查询所有同学的学号、姓名、选课数、总成绩3、查询平均成绩大于60分的同学的 学号和平均成绩4、查询姓“葛”的老师的个数5、查询没学过“五木”老师课的同学的学号、姓名6、查询学过“101”并…

数据库复习题选择题+判断题+填空题(考试续命必备

数据库复习题选择题判断题填空题(考试续命必备 一些选择题 1、从计算机数据管理的角度看,信息就是数据,数据就是信息。(B ) A、对 B、错 (描述事物的符号记录称为数据 数据库的数据项之间无联系,记录之间存在联系。…