java:int强制类型转换成byte

简介: int 在java中是32位, byte是8位原码:就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值反码:在原码的基础上,正数反码就是他本身,负数除符号位之外全部按位取反补码:正数的补码就是自己本身, 负数的补码是在自身反码的基础上加1

一、基础知识



int 在java中是32位, byte是8位


原码:就是二进制码,最高位为符号位,0表示正数,1表示负数,剩余部分表示真值


反码:在原码的基础上,正数反码就是他本身,负数除符号位之外全部按位取反


补码:正数的补码就是自己本身, 负数的补码是在自身反码的基础上加1


二、int->byte



int类型转化为byte类型时会出现位丢失情况,即将int的低8位作为byte类型的值。


举例:


byte b=178;

这样对b变量初始化是错误的,因为byte是1个字节,而一个字节的范围是 { -128,+127 },显然178超过了127


正确的做法是进行强制类型转换:

byte b=(byte)178;

此时b的值变成了-78,为什么呢?


首先,Java中变量,或者说计算机底层是以补码保存,int类型178强转byte流程应该是这样:

int类型178二进制表示:

原码/补码/反码:0(符号位)000,0000,0000,0000,0000,0000,1011,0010

转为byte类型后,因精度丢失,补码表示为1(符号位)011,0010。


此处求原码有两种方式:


方法一


按照原码求补码的方式反推,如下所示:


补码:1(符号位)011,0010

反码:1(符号位)011,0001

原码:1(符号位)100,1110


方法二


如图示,对整数的补码再求一次补码即为整数原码;

二进制数1001110转换为十进制是78,符号位1表示负数,结果即为-78


补码始终是二进制的一种表现形式,是二进制数据在内存中的存储形式。我们习惯表达的十进制,在这里是通过原码进行进制转换得到的,只有原码是十进制数转换成的二进制序列。

4142e7d663e94a1f9039f613548466e7.jpg

相关文章
|
2月前
|
存储 Java
Java入门——数据类型、自动类型转换、强制类型转换
Java入门——数据类型、自动类型转换、强制类型转换
22 2
|
3月前
|
存储 安全 Java
【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型
【Java开发指南 | 第三篇】Java 空行、强制类型转换及基本数据类型
36 6
|
1月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
21 0
|
1月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
25 0
|
3月前
|
缓存 安全 Java
Java的Integer和int有什么区别?
Java的Integer和int有什么区别?
30 1
|
3月前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
3月前
|
Java 程序员
Java中的强制类型转换(Explicit Type Casting)
Java中的强制类型转换(Explicit Type Casting)
66 0
|
3月前
|
Java 程序员
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
【JAVA面试题】基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
|
3月前
|
Java
java 数组转字符串 和字符串转int
【4月更文挑战第11天】java 数组转字符串 和字符串转int
51 2
|
3月前
|
关系型数据库 MySQL Java
Java时间转换为MySQL中的INT类型时间戳
Java时间转换为MySQL中的INT类型时间戳