00:00
行了,那我们继续再往下看吧,这个我就先关了啊,这个呢我清一下。卡了。来这边我清楚一下啊。那这个呢。行,咱们接着再往下看啊,那么再往下呢,咱们看一看什么内容呢?嗯,我来写一个程序啊,大家来看一下这个结果是多少。TT05。嗯。来看一下啊。Public staticman。那么现在呢,我在这里啊,我写一个程序,各位啊,这个程序是这样写的,BYB等于150。
01:01
现在呢,我点out点打印输出啊,我输出什么呢?输出这个B。现在行不行呢?这个肯定是不行对吧,这个会编译报错。对不对,编译报错。因为啊,这个150已经超出了BA的取值范围。啊,因为一百五已经超出半了,不能直接赋值啊,不能直接赋值。需要强转。所以我这里就不带编译了,所以这个程序啊,我就直接给它改成这样,前面加一个强的转换,那我想问的是这个结果输出会是多少呢。会输出。多少呢?嗯。好了,那么这块呢,这个我得给大家讲点新的东西了,这个内容啊,能听懂的就听,听不懂没关系啊,你就把它隔过去,呃,按说这个内容是不需要讲的,因为以后我们也不会接触啊,这是关于计算机底层的一个原理问题,所以我在此声明一下,能听懂就听,听不懂就算了啊。
02:11
来。首先呢,第一点啊,计算机任何情况下啊,都只能识别什么二进制。啊,这是第一个结论,第二个计算机啊,计算机在在底层存储数据的时候,存储数据的时候。一律啊,存储的是什么呢?是二进制的补码形式啊,二进制的补码形式。啊,补码形式。啊,所以这个呢,是我在讲,你听就行了,计算机在底层存储数据的时候,一律存储的是二进制补码信息。
03:00
那同学肯定现在有疑问啊,为什么有疑问啊,因为啊他不知道补码是啥,那么接下来我来讲一讲补码啊,讲讲补码,那有同学可能又又问了,说老师计算机为什么采用二进制补码的形式,呃,去存储数据,这个呢,咱就不再嗯。追究了啊,计算机采用补码形式存储数据的原因是补码形式效率最高,那么这个效率到底怎么就高了,咱们不用深挖,我说了啊,咱们的课程不是做学术性研究,也不是说我们做这个应试性的培训,我们是这种实战型的,所以像这种东西,我刚才刚开始讲,我就已经跟大家说了这个东西啊,大家以后呢,其实也不用太纠结啊,能听懂就听,听不懂就算了啊来,首先第一点计算机只能识别二进制,这是告诉大家的一个东西,第二点要注意,计算机底层永远存储的都是二进制补码形式,为什么采用补码形式存储,我只能这样告诉你啊,补码形式存储啊,它效率最高,那么什么是补码呢?
04:06
对吧,哎,实际上是这样的,实际上是这样的二进制啊,有什么呀,有这个源码啊,反码和补码这一说啊。有这个原码反码补码这一说。啊,那么。记住记住啊,对于一个正整数来说啊,对于一个正整数来说。二进制原马、反马、补马是同一个,完全相同。啊,完全相同,这是对于一个正数来说啊,或者对于一个正数来说吧,啊,二进制的原码反码补码是同一个。
05:03
比如说我们int类型I等于一,那么这个对应的二进制。源码是啥啊,就是12345678123456781234567812345671。啊,它对应的这个二进制的一个反码是什么?二进制的反码。它还是这个值啊,那么它所对应的这个二进制的一个补码是还是补码。啊,补码还是它,那么如果说对于一个负数来说呢,这个你记住就行,各位啊,这是计算机原理底层的啊,对于一个正数来说,二进制原码反码补码是同一个完全相同的,但对于一个负数来说,对于一个负数来说。
06:00
复数啊来说二进制原码反码补码是什么关系呢?我在这里给大家说一下,业内型I呢,等于负一啊等于负一,那么对应的二进制源码是什么?啊,二进制源码是什么呢。现在我我直接这样吧,别别别int了啊,Int老费劲了,因为啥int是四个字节,我叭叭叭叭还得写这些东西是不是哎比较费劲啊,所以这块呢,我就直接给它改成BYT啊,一个字写BAT负一,那么它的这个源码是什么呢?哎,原码是首先第一个我们是负数对吧,复数呢,第一位是什么呀?是一对不对啊,然后呢,后边是12345677个零,但最后这个零啊,咱得是一个一啊,这就是我们二进制圆码那么对应的。这个二进制,这个这个叫反码是什么。啊,然后呢,对应的二进制补码是什么啊,反码是符号位不变,其余啊符号位不变啊,其他位取反取反,这就是负数的反码,所以说这个它的反码是符号位不变啊,这个是一。
07:22
111110啊,这个就是我们的。一个一个负一所对应的反码啊反码。啊,符号位不变啊,其余位求反。那补码是什么呢?补码是反码加一。反加一啊就是。这个二进制源码所对应的补码是这个反码。加一。所以它的这个结果就变成了它。啊,就变成了他。
08:03
这个就是关于我们这个。复数它的源码反码和补码啊,原码反码和补码,他们之间的关系就是这样一个关系,那有同学老师研究这东西有啥用,其实也没用,以后用不着啊,以后用不着只是就是说如果我现在给你这么一个题目,对吧,你比如说150,现在我强转啊,转完之后呢,哎,我这一块干什么呀。输出结果是多少?来我们来看一下,分析一下啊,分析这个BYB等于150,一百五强转转成BAT。这个B是多少?来各位注意啊,我们来看这个100。这个数据它是个int对吧。Int类型的四个字节的一百五的二进制码是什么?
09:00
啊,那么这个二进制码,我们一起研究一下。嗯,在这儿打开一下啊呃,我们还是用笔呢,简单的画一下啊,简单的画一下来,那这块呢是幺二。四。对吧,八十六三十二六十四。然后呢,是128。那么这个是一百五对吧,128,那还剩什么呀?还剩算是22对吧,22啊,那么22这块的话应该是16再加四再加二呗,16加上四呢,应该是二十二十再加二十二十二呗。所以应该是什么呢?我用红笔标一下啊,应该是一个一,然后零对吧,然后是零,然后呢是一啊,然后是零对不对,然后是一啊,然后什么一,然后什么呀零。那么也就是说这个一百五它所对应的二级码是10010110。
10:06
啊,100100。10110啊,10110,那由于它是一个四个字节的。所以前面应该是有12345678 12345678 12345678,好,那么现在大家想一想,这个就是一百五所对应的二进制码对吧?那么接下来它做强制类型转换转转的时候把转成,那就意味着是不是要把前面三个字节全部砍掉啊,砍掉是不是就剩这个了?对吧,那将以上的int类型强制类型转换。转换为一个字节的BAT啊,最终在计算机中的二进制马氏。
11:08
这个。来,注意啊。但是你要注意在计算机里边存的这个东西,它是个什么补码形式,千万千万要记住啊,千万要注意,千万要注意,计算机永远存储的都是二进制补码形式,那么也就是说啊,上面的这个。因为你是一百五嘛,一百五是它,它转成bet会把前三个砍掉,剩下的是这个,这个数呢,在计算机里边存的就是它,计算机里面存的就是它,我刚才给大家说了,计算机在底层存储的,一律存储的是二进制补码形式,那么也就是说这个数据是是补码对吧。也就是说上面这个二这这个是一个二进制补码形式。
12:05
啊,你可以,你可以采用逆推的方式啊,逆推的方式逆推。哎呀。采用这个逆推导的方式啊,推导的方式啊,推算出。这个二进制补码对应的源码是啥?来,各位。就现在你要清楚啊,这个二进制啊,它是一个什么呀,它是一个这个补码形式啊,在计算机里边存的就是它呀,它是个补码呀,那补码这块它是怎么通过原码变成补码的呀。原码是符号位不变,然后其余位求反是反码。反码基础上再加一,这个就是什么呀,我们的这个补码形式,那如果从补码往回逆的话,怎么逆。
13:09
应该是补码怎么着啊,减一对吗?补码减一之后得出的这个值是什么?是反码对吧?那么反码如果符号位不变,个位再给他求回去的话,那是不是就是码呀,各位哎,所以说在这块的话,我们应该怎么做呢?首先这个是一个二进制什么呀?哎,二进制。形式,二进制形式。它所对应的。这个反码是什么?二进制反码是什么?你得把这个数据减去一。这个数据如果减减一的话,因为这个值是加一算出来的吗?就你得减110,减一应该是零一对吧。
14:01
是不是呀?对吧,这个一零啊,减一是不是零一呀,哎,是零一啊,那么接下来我们如果再把这个这是二进制反码形式,如果再给它符号位不变啊,符号位不变,每位再给它取反,我们试一下,那么这个呢,如果是一的话,对吧?这个就这个符号位不变啊,这个地方呢,那就是几啊是一一这是什么呀?零这是呀,一这是什么呀?零这是一这是什么呀?零好,那么接下来这个其实就是二进制的一个源码形式,那么二进制源码形式那111对吧,0101。哎,我们看看啊,把这个数据拿过来,数据过来啊。我们从这呢新建一个。新建一个啊,我们给他拿过来啊,就这个数据,也就是说现在的这个数据是什么呢。诶,是。111。
15:01
零幺。零幺。零。啊,12345678,这个不算各位,这是符号位啊,它是一开始表示是个负数。表示它是个负数,各位啊,后边这个是幺。二。四。八。16。32。64。对吧,那也就是说64加上什么呀,32吧。再加什么呀,这个就不加了,这是零,这是零不加了,这个是零不加了对吧,加上八对不对,再加上什么呀?二。那么我们来看看这个八加二呢,是十对不对啊是十,那么这个呢,实际上是96对吧,哎,96,那么这个96加上十是多少呢?它是。
16:05
106,那么由于前面是一个负号,所以它是负的106。明白吗?所以大家看这个结果呀,其实是什么呢?哎,是负的106啊,到底是不是我们一会儿输出一下就可以了,这个呢,是二进制的一个源码形式,就是它通过它呢,我们得出的这个结果是负的106,那么接下来我们来编译一下各位啊,编译一下。来,我们看一看这个程序。呃,Java c呢,去编译一下我们的一个int05.va啊编译编译之后呢,Java去行int test05。好,大家看最后结果啊,是负的106,这就是我们刚才推算出的这个结果啊,那有同学老师咱推算这个结果有啥用啊,哎,还是那句话,没用啊,推算这个结果没有啥意义,没有什么意义,有啥意义啊。
17:01
对吧,哎,没有意义啊,以后我们有点懵是吧。那有点懵,这个怎么说呢,下一周捋捋吧,啊,下一周捋捋,因为这个原码反码补码啊,它有这样一个转换的关系,你要知道正数的原码反码补码是同一个啊,是同一个。原码反码补码是同一个啊,然后负数的原码是这样的,反码是符号位不变,个位取反,这个就是我们的反码,然后补码其实就是这个反码再加一啊,所以说你如果是负一的情况下,实际上在底层是采用这个方式进行的啊进行的。正数都是一样的。正数都是一样的啊,这是规定正数都是一样的,负数这一块啊,咱们是不一样的,原码反码补码是不同的,各位啊,原码反码不不同,那么。刚才这个推推导的过程下来之后,自己演示一下各位啊,还是那句话,这个不是重点啊,作为了解内容啊,别死到这里啊,死到这里你就完了啊,因为呃,根据我多年的这个编写代码这个经验啊,因为我们在实际开发中,我们这个几乎没用啊,几乎没有用,没用过呀,没用过啊。
18:15
150整数你不强转了吗?你强壮了呀。你强转前三个字节砍了呀。那你如果说是int类型的什么I等于一百五的话,那你当然就不用动了,是不是你强转了啊,强转就不一样了啊,强转就不一样了啊。好了,这个不说了啊,这个不说了。
我来说两句