JAVA:byte和int类型的转换

您所在的位置:网站首页 原码补码和反码转换 JAVA:byte和int类型的转换

JAVA:byte和int类型的转换

2024-07-14 21:16:27| 来源: 网络整理| 查看: 265

byte和int类型的转换-原码反码补码 byte是什么?补充:字是什么?有符号数是什么?一个字节取值范围为何是-128~127?补码?知道原码如何求补码?知道补码如何求原码?举例 数据类型转换:int类型和byte类型的转换自动转换:byte转intint转byte如果|value|127为什么会这样呢?128发生错误-128未发生错误 结论:int转为byte后,是否可以正确的转回来? 一个使用实例背景:分析:我们来看一段代码1、下位机分解:取低八位2、下位机分解:取高八位3、上位机合成:恢复高八位4、上位机合成:恢复低八位5、上位机合成:合成 温度为负数时1、下位机分解:取低八位2、下位机分解:取高八位3、上位机合成:恢复高八位4、上位机合成:恢复低八位5、上位机合成:合成 小数如何用字节表示结论: 最后,关于我们为什么要&0xff之类的操作? 注意:因为知识的关联性,最好顺次看下去。当然你也可以直接看实例,遇到不会的,比如补码,再目录跳转回去。

byte是什么?

字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符。一个字节存储8位无符号数,储存的数值范围为0-255。 简单来说就是,计算机是用二进制来表示数据的,一个字节(byte)用8个比特位来表示,可以表示2^8=256个数,范围为(000000000-11111111),即0~256。 char 2个字节 short (2个字节) int(4个字节) long(8个字节) float (4个字节) double(8个字节) 一个小知识:在java中,一个字节8位,要用2两个十六进制表示(一个十六进制是4位),所以一个字节要用2个十六进制数表示。

补充:字是什么?

字(Word)代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。 对于32位计算机与64位计算机,字的大小往往不同。 32位计算机:1字=32位=4字节,64位计算机:1字=64位=8字节

有符号数是什么?

在实际的程序语言中(比如Java),又划分为有符号,与无符号。 对于有符号数,最高位表示符号位,最高位为1时为负数,最高位为0是正数。 由于最高位是符号位,所以可表示数的范围只有7位。因此其绝对值最大范围为0-127,即2^7=128。

一个字节取值范围为何是-128~127?

根据上文所述,最高位为符号位,剩下七位表示数据,可以表示0-2^7。 如果一个数是正数,最大数则为:01111111,转为十进制为127, 如果一个数是负数,按照一般人都会觉得是11111111,转为十进制为-127, 但是:一个+0表示为:00000000,一个-0表示为:1000000,因为符号位不算在里面,所以就会有两个0,所以从一开始发明二进制的时候,就把-0规定为-128,如此二进制的补码就刚好在计算机中运作中吻合。(这是国内教材中的解释) 公式:计算一个数据类型的数据大小范围:-2^(字节数7)~ 2^(字节数7)-1 故byte的取值范围为1000 0000 到 0111 1111

补码?

在Java中,是采用补码来表示二进制数。

知道原码如何求补码?

正数的补码和原码相同,负数的补码是在原码的基础上各位取反然后加1。

知道补码如何求原码?

已知一个数的补码,求原码的操作其实就是对该补码再求补码。 补码转换为原码:符号位不变,数值位按位取反,末位权再加1。即补码的补码等于原码。 正整数的原码、反码和补码是一样的,即看到符号位(第一位)是0,就可以照着写出其他两种码。所以已知正数的补码,求其原码,两个数是一样的。

举例

已知补码为1000000,求其原码 11111111+1=10000000(超出范围舍去) 在这里插入图片描述

数据类型转换:int类型和byte类型的转换

int类型在内存中占用了4个字节,也就是32位。int类型是有符号的,因此,32位并不会全部用来存储数据,使用最高位来存储符号,最高位是0,表示数据是正数,最高位是1,表示数据是负数,使用其他的31位来存储数据。 注意:在Java中,是采用补码来表示二进制数

int temp = 30; System.out.println("二进制:" + Integer.toBinaryString(temp)); int temp = -30; System.out.println("二进制:" + Integer.toBinaryString(temp)); 二进制:11111111111111111111111111100010 二进制:11110

举例-正数(正数的补码和原码相同): int类型的1,在内存中表示就是最高位为0,数值为1,其余位补0 0000 0000 0000 0000 0000 0000 0000 0001 int类型的128,在内存中表示就是最高位为0 0000 0000 0000 0000 0000 0000 1000 0000

举例-负数(负数的补码是在原码的基础上各位取反然后加1): int类型的-30,在内存中表示就是最高位为1,数值为11110 原码为 1000 0000 0000 0000 0000 0000 0001 1110 由于计算机存储的是二进制的补码,补码为原码除最高位外,取反+1

1111 1111 1111 1111 1111 1111 1110 0001 + 1 = 1111 1111 1111 1111 1111 1111 1110 0010

数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。

自动转换:byte转int

自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下: 低--------------------------------------------->高 byte,short,char-> int -> long -> float -> double

byte valueByte=127; int valueInt=valueByte; System.out.println(valueInt); 127

自动转换,不会出现数据错误。前提是赋给valueByte的值在-128~127范围内,如果超出范围,ide会自动提醒: 在这里插入图片描述 如上,把赋值当做int类型处理,需要int类型强制转换为byte后再赋给valueByte.

byte valueByte= (byte) 128; int valueInt=valueByte; System.out.println(valueInt); -128

这个时候产生的数据错误(输入128,结果却是-128),是因为第一行代码就产生了强制转换。

int转byte

强制转化,需要在代码中声明 高--------------------------------------------->低 double->float -> long -> int -> byte,short,char

如果|value|127

此时数据超出范围,截取到的数据就会发生错误

int value = 128; System.out.println((byte)value); -128 int value = -128; System.out.println((byte)value); -128 为什么会这样呢? 128发生错误

因为128已超出byte的可表示范围,前面说过int类型的128在内存中存储为 0000 0000 0000 0000 0000 0000 1000 0000 这时候对128进行强制类型转换,因为byte只有1字节,即8位,所以这个二进制串就要被截短,截取的规则是:只保留低8位:10000000。 被截取掉的只是1前面的24个0,看起来好像并没有影响数据大小,但这个时候的二进制串还表示128吗? 不是了,因为byte的最高位代表的是符号位。也就是说现在1被用来作符号位了,即代表是负数, 后面的7个0000000才用来表示数值,结合起来1 0000000 代表的就是-128。

-128未发生错误

因为-128没有超出取值范围 11111111111111111111111110000000 转换为byte,只剩下了1000 0000,正好是-128。 如果测试一下-129,就会发现结果也是错误的,因为他也超出范围了。到此我们已经知其所以然了,详情可以自己去试。

结论:int转为byte后,是否可以正确的转回来?

如果int值范围为-128~127,int值和byte值一致。 如果int值大于255或者小于-256,值肯定是还原不了,信息已经丢失一部分。 如果int值大于127小于等于255,第八位是1,相应的byte是负值,使用int x = b&0xff,因为b在表达式里面会自动提升为int,所以会在高位补齐1(按符号位补齐),因为我们知道对应的int是正值,所以这时把高于8位的1全部换成0。 例如:128

原数据:0000 0000 0000 0000 0000 0000 1000 0000 转化为byte为1000 0000 还原数据: 1111 1111 1111 1111 1111 1111 1000 0000 & 0xff: 0000 0000 0000 0000 0000 0000 1111 1111 = 0000 0000 0000 0000 0000 0000 1000 0000

如果int值小于-128大于等于-256,第八位是0,前面所有位都是1,相应的byte是正值,使用int x=b|0xffffff00,b在表达式中自动提升为int,所以高位补齐0(按符号位补齐),把第八位前面所有的0替换成1,就可以得到正确的值。 例如:-129

原数据:1111 1111 1111 1111 1111 1111 0111 1111 转化为byte为0111 1111 还原数据: 0000 0000 0000 0000 0000 0000 0111 1111 | 0xffffff00: 1111 1111 1111 1111 1111 1111 0000 0000 = 1111 1111 1111 1111 1111 1111 0111 1111

由于由于int有32位,byte只有8位,只能强制转换截取低八位。而在byte表示中,虽然有八位,但只有七位是用来表示数据的,最高位为符号位,只表示正负,可以表示数的范围为(-128~127)

一个使用实例 背景:

和下位机进行通信时,需要交换温度信息。协议规定,温度由2 bytes表示,有符号整数,高字节在前,低字节在后。除以100转换为精确到小数点后两位的浮点数值,表示设置的摄氏温度值。

分析:

下位机发送数据:50度,50*100=5000,转化为二进制1 0011 1000 1000 高字节,为高八位,未占满补0:0001 0011 低字节,为低八位:1000 1000 下位机传过来就是一个这样的数据,那么我们如何拼接回去呢?

我们来看一段代码 int temp = 5000; byte low = (byte) (temp & 0xff); byte high = (byte) ((temp & 0xFF00) >> 8); int result = ((high & 0xff) 8);

取高八位:

0000 0000 0000 0000 0001 0011 1000 1000 & 0000 0000 0000 0000 1111 1111 0000 0000 = 0000 0000 0000 0000 0001 0011 0000 0000 右移八位 0000 0000 0000 0000 0000 0000 0001 0011

强转为byte,保留低八位

0001 0011

=19,转化为十六进制=13 由上可看出&0xFF00只是为了保留高八位的值

3、上位机合成:恢复高八位 (high & 0xff)


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭