byte和int的浅解

1.byte范围为什么是(-128~127)?

--byte是8位

--这里定义2种8位展现形式:1,符号形式(第一眼看符号位,判断正负,然后计算剩下7位的数值)。2,存储形式(内存中都是补码存储)

--想要知道一个数在内存中如何存储?真值 >> 符号形式 >> 补码 >> 存储形式

--示例1:

+8(真值)

+8(符号形式):0000 1000,//真值"+8",因为是"+",所以将第一位定义为0,因为值是"8",所以剩余7位是"000 1000"。

+8(补码): 0000 1000

+8(存储形式):0000 1000,//因为正数的补码就是本身,所以内存中的存储形式是"0000 1000"。

--示例2:

-8(真值)

-8(符号形式):1000 1000,//真值"-8",因为是"-",所以将第一位定义为1,因为值是"8",所以剩余7位是"000 1000"。

-8(反码): 1111 0111,

-8(补码): 1111 1000,

-8(存储形式):1111 1000,//经过取补码后,-8在内存中的存储形式是"1111 1000"

--已经知道一个数在内存中的存储形式,求这个数?存储形式 => 符号形式 >> 补码 >> 符号形式 >> 真值(注意:这里是"=>",不是">>",表示把"存储形式"当成"符号形式"使用")

--示例1:

+8(存储形式):0000 1000

+8(符号形式):0000 1000,//把"0000 1000"当前符号形式,第一位是"0",说明这个数是正数,所以补码为本身

+8(补码): 0000 1000,

+8(符号形式):0000 1000,//第一位是"0",那么这个真值的符号是"+",后面7位是"000 1000",数值是"8"

+8(真值):           //所以真值是+8

--示例2:

-8(存储形式):1111 1000

-8(符号形式):1111 1000,//把"1111 1000"当前符号形式,第一位是"1",说明这个数是负数,需要计算其补码

-8(反码): 1000 0111,

-8(补码): 1000 1000,

-8(符号形式):1000 1000,//第一位是"1",那么这个真值的符号是"-",后面7位是"000 1000",数值是"8"

-8(真值):           //所以真值是-8

--验证:(byte)-8的存储形式是"1111 1000"

int i = -8;

System.out.println(Integer.toBinaryString(i)); //打印int类型在内存中的2进制表示,"1111 1111,1111 1111,1111 1111,1111 1000"

System.out.println((byte)i);       //打印"-8",此时byte类型的-8的内存表示为int类型出去左边24位,也就是"1111 1000"是byte型-8的存储形式,和上述例子中的结果相符

--那么上面的这些例子和证明byte的范围有什么关系呢?

--byte为8位,所以要么全为"0000 0000",要么全部为"1111 1111",因为第一位是符号位,所以可以分为以下3部分。

--正数的范围: 0000 0001(代表+1)   ~~  0111 1111(+127)

--0的存储形式:0000 0000

--负数的范围: 1000 0000(代表-128) ~~ 1111 1111(-1)

--以上都是存储形式,正数和0就不解释了,解释下负数的范围:

--(1000 0000)求解过程:

(存储形式):1000 0000

(符号形式):1000 0000,//第一位是"1",说明这个数是负数,需要计算其补码

(反码):    1111 1111,

(补码):    1000 0000,//第一位是"1",那么这个真值的符号是"-",后面7位的反码是"111 1111",补码是"1000 0000",数值是"128"

(符号形式):1000 0000,//真值是"-128",

--(1111 1111)求解过程:

(存储形式):1111 1111

(符号形式):1111 1111,//第一位是"1",说明这个数是负数,需要计算其补码

(反码):    1000 0000,

(补码):    1000 0001,//第一位是"1",那么这个真值的符号是"-",后面7位的反码是"000 0000",补码是"000 0001",数值是"1"

(符号形式):1000 0000,//真值是"-1",

2.int >> byte

--(1).假设int的取值范围是(-128~127):

--示例1:

int i = 64;

System.out.println(Integer.toBinaryString(i));
//存储形式:0000 0000,0000 0000,0000 0000,0100 0000

System.out.println((byte)i); //去除左边24位,剩余"0100 0000",这是存储形式,通过上述例子中的逆转方式,打印64

--示例2:

int i = -64;

System.out.println(Integer.toBinaryString(i));
//存储形式:1111 1111,1111 1111,1111 1111,1100 0000

System.out.println((byte)i); //去除左边24位,剩余"1100 0000",这是存储形式,通过上述例子中的逆转方式,打印-64

--(2).假设int的取值范围是(>127,<-128):

--示例1:

int i = 128;

System.out.println(Integer.toBinaryString(i));
//存储形式:0000 0000,0000 0000,0000 0000,1000 0000

System.out.println((byte)i); //去除左边24位,剩余"1000 0000",这是存储形式,通过上述例子中的逆转方式,打印-128

--示例1:

int i = -129;

System.out.println(Integer.toBinaryString(i));
//存储形式:1111 1111,1111 1111,1111 1111,0111 1111

System.out.println((byte)i); //去除左边24位,剩余"0111 1111",这是存储形式,通过上述例子中的逆转方式,打印127

3.byte >> int,有这样一个疑问,为什么8位byte型的-8转换成32位int型后值还是-8?

--示例1:

byte b = 8; //byte存储形式:0000 1000

System.out.println((int)b); //因为"8"是正数,所以在左边补充24位"0"

//int存储形式:0000 0000,0000 0000,0000 0000,0000 1000,通过上述例子中的逆转方式,所以int的数值也是8

--示例2:

byte b = -8; //byte存储形式:1111 1000

System.out.println((int)b); //因为"8"是负数,所以在左边补充24位"1"

//int存储形式:1111 1111,1111 1111,1111 1111,1111 1000,通过上述例子中的逆转方式,所以int的数值也是-8

4.最近看到一种byte转int的写法"byte & 255"或"byte & 0xFF",以下是解析其过程转换。

int getInt(){

byte b = -8;

return b & 255;

}

--解析过程:

byte b = -8; //byte存储形式:
1111 1000

//那么int存储形式:
1111 1111,1111 1111,1111 1111,1111 1000

//255的int存储形式:
0000 0000,0000 0000,0000 0000,1111 1111

//进行&操作:
0000 0000,0000 0000,0000 0000,1111 1000,打印结果就是248

//int转byte型,去掉左边24位:
1111 1000,通过上述例子中的逆转方式,打印-8,所以是不冲突的,这里只解释"&255"操作的过程。

byte和int的浅解,布布扣,bubuko.com

时间: 2024-07-31 14:35:22

byte和int的浅解的相关文章

浅解多线程(二)之和尚们的那些事儿

浅解多线程(一)之线程入门起步 本文链接 确定多线程的结束时间,thread的IsAlive属性 线程优先级,thread的ThreadPriority属性 线程通信之Monitor类 线程排队之Join 多线程互斥锁Mutex 信号量semaphore 确定多线程的结束时间,thread的IsAlive属性 在多个线程运行的背景下,了解线程什么时候结束,什么时候停止是很有必要的. 案例:老和尚念经计时,2本经书,2个和尚念,一人一本,不能撕破,最短时间念完,问老和尚们念完经书最短需要多长时间.

面试-1-C#浅解

C#浅解众所周知c#是微软推出的一款完全没面向对象的编程语言,那么对象是什么?在现实生活中人们一提到对象首先想到的就是"情侣"!但是在我们的程序中对象是什么? 在程序中个能够区别于其他事物的独立个体我们称它为对象他是类的一个实例.那么现在问题来了 ,你说对象是类的实例.那类又是什么?好 在程序中类是多个对象的统称他是对象的模版规定了对象所具有的行为(方法)和静态特征(字段).这是有人可能会问"是先有类还是先有对象?"关于这个问题我们就要分情况讨论了第一种情况:在现实

write(byte[] b, int off, int len)

write(byte[] b, int off, int len)就是将数组 b 中的 len 个字节按顺序写入输出流. 所以如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,又或者 off+len 大于数组 b 的长度,则抛出 IndexOutOfBoundsException. 如果 len 为零,则不写入字节. 否则,首先写入字节 b[off],然后写入字节 b[off+1],依此类推:最后一个写入字节是 b[off+len-

浅解 go 语言的 interface(许的博客)

我写了一个 go interface 相关的代码转换为 C 代码的样例.也许有助于大家理解 go 的 interface.不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节. Go 代码: package main import "fmt" // ------------------------------------------------------------- type IReadWriter interface {     Read(buf *byt

Java - byte[]与int的互相转换

public static int byte2Int(byte[] b, int begin, int len) { int sum = 0; int end = begin + len; int n; for (int i = begin; i < end; i++) { n = ((int) b[i]) & 0xff; n <<= (--len) * 8; sum = n + sum; } return sum; } public static byte[] int2byte

基于java的InputStream.read(byte[] b,int off,int len)算法学习

public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节,但可能读取较少数量.以整数形式返回实际读取的字节数. 在输入数据可用.检测到流的末尾或者抛出异常前,此方法一直阻塞. 如果 b 为 null,则抛出 NullPointerException. 如果 off 为负,或 len 为负,或 off+len 大于数组 b 的长度,则抛出 IndexOut

[C]基本数据类型:整型(int)用法详解

1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整型. int代表有符号整数,也就是说,用int声明的变量可以是正数,可以是负数,也可以是零,但是只能是整数.标准规定int的最小取值范围是-32767到32767.int的取值范围因机器而异,但是一定要大于或者等于-32767到32767.一般来说,int占用一个字的内存空间.因此,字长为16位(B

[从玩游戏来理解编程]关于面向对象编程的浅解(1)

我最近在玩星际争霸2,感觉到面向对象真是太重要了.有三个种族,每个种族有自己的兵种,一个兵种就是一个类,而且他们的父类都是一个类. 每个单位都有自己的属性和技能,之前学习的c语言是面向过程的,慢慢的也理解到了面向对象在某些地方的重要性. 之前都是在学习算法,实现上用的c语言,看不出来到底有什么区别,反而在用c来的更简洁和更快,最近慢慢的接触到小项目之类的什么的就慢慢感觉到面向对象的重要性. 最近在看一本书叫<making games with python and pygame>,这本书很好,

什么样的数据算是byte类型,int类型,float类型,double类型,long类型

byte类型,就是字符类型.这类数据是字符组成的 INT 类型,为整型数字,不同语言定义的范围不同 FLOAT,为数字浮点型,其小数点后面可以跟N个数字 DOUBLE,为双精度数字类型,其小数点后只能有两个数字 LONG,为长整型其范围要比INT类型范围广 什么样的数据算是byte类型,int类型,float类型,double类型,long类型