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

相关文章
|
5天前
|
Java
byte加byte居然是int了
为什么在Java中,byte加byte的结果不是byte,而是int?本文将带你从Java语言规范和JVM规范层面研究该问题。
24 3
byte加byte居然是int了
|
6天前
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第20天】Java零基础教学篇,手把手实践教学!
24 4
|
11天前
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第16天】Java零基础教学篇,手把手实践教学!
9 1
|
5月前
|
Java UED
Java中String强转int:一种常见的错误和解决方法
在Java中将非数字字符串转换为整数会导致`NumberFormatException`。要解决这个问题,可以使用`try-catch`捕获异常,正则表达式验证数字格式,或利用异常信息提供错误提示。例如,`Integer.parseInt()`会因遇到非数字字符如`"123abc"`而抛出异常,但通过异常处理或正则`\\d+`可确保安全转换。记得在编程时避免直接强转,以防止程序异常中断。
|
20天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
41 3
|
2月前
|
Java
Java强制类型转换需要注意的点
在 Java 中,强制类型转换(显式类型转换)用于将一种数据类型转换为另一种。然而,这一过程需谨慎处理以避免以下问题:数据丢失,尤其是在从大范围类型转换到小范围类型时;类型不兼容,如 `String` 无法直接转换为 `int`;对象类型转换时应确认实际类型与目标类型兼容,可借助 `instanceof` 运算符;处理基本类型与包装类之间的自动装箱和拆箱时需注意 `null` 值;浮点数转整数时会截断小数部分;字符转整数则得到 Unicode 值。充分理解这些注意事项有助于避免运行时错误和数据不一致。
|
3月前
|
Java
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
这篇文章解释了Java中`int`基本数据类型和其包装类`Integer`之间的区别,并指出在进行`==`运算时,`Integer`会拆箱为`int`类型,然后比较它们的值是否相等。
【Java基础面试十一】、int和Integer有什么区别,二者在做==运算时会得到什么结果?
|
3月前
|
Java
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?
|
4月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
50 0
|
4月前
|
Java Apache Maven
Java:commons-codec实现byte数组和16进制字符串转换
在上述代码中,`Hex.encodeHexString(bytes)`用于将byte数组转换为16进制字符串,`Hex.decodeHex(hexString)`用于将16进制字符串转换为byte数组。
105 0