00:00
我们现在已经了解了scla里边的数据类型系统,那接下来我们就针对一些常见的数据类型展开做一下讲解啊,那首先最为常见的那自然就是整数数据类型了,那SKY里边的整形呢,跟Java里边其实非常的类似啊,也是有这样的四种整数类型,就是bit short inlo啊,那对于这四种不同的整数类型来讲,它们的共同特点当然就是都是用来存放整数值的,而且呢是有符号的整数,那它们的区别呢,主要就在于对应的,这样每一种类型的变量在内存里边占据的空间是不同的。啊,那他们从小到大分别就是bit short int long bitt占据的是一个字节,Short呢占据两个字节,Int占据四个字节,Long占据八个字节,那对应的它们其实能够表示的数的范围也就有所不同,大家都知道一个字节其实是八位啊,那所以我们所说的一个BAT啊,那它其实就是一个字节,就是一,就是八位这样的一个有符号补玛整数,那所谓的八位有符号补玛整数能表示的范围到底是多大呢?
01:17
有符号,那所以这八位里边首先就得拿出一位来表示当前的符号,怎么第一位如果是零的话,表示这是正数,如果是一的话,那就表示这是负数,然后后边的七位。才是真正意义上的。当前表示数值的那个,呃,具体的位数啊,那所以接下接下来我们就想到了七位比七个二进制位到底能表示多大的整数呢。哎,所以大家自然想到了七个二进制位,那其实不就是二的七次方吗?它能表示的这个所有数据的个数不就是二的七次方吗?哎,所以二的七次方。
02:02
大家都知道,其实就是128对吧?哎,但是大家要注意啊,它的个数是128,那其实它能表示的范围应该是零到127。所以再加上前面的正负,我们就知道了,它应该能表示的范围是正的零到127和负的127到零,哎,所以大家看到这个过程的话,就会发现,那整个能表示的范围不就是负的127到正的127吗?诶,但是这里边有一个数其实出现了重复,那大家想一下,你前面这个正的正数啊,表示是零到127,那大家知道,如果后边都是000000007个零的话,前面一个零,后面七个零的话,这表示的其实就是正零。啊,那接下来大家会想到,如果要是负数反过来表示的话,负127到零,那因为这里是补码表示嘛,我们最终是取反加一,所以我们知道如果前面是一,后边是零的话,10000000。
03:09
这个数,呃,大家知道这本身是补码嘛,补码如果要是返回去转换成原码的话,其实也是直接取反加一就可以,那取反加一大家发现还是零对吧?哎,所以这个如果要完整写出来的话,这其实是负零啊。00000000和一零零零零零零零两个数表示的分别表示的是正负零,这显然就有有所浪费了,我们没必要把这个零还区分正负啊,哎,所以一般情况我们在规定的时候呢,就是00000000这八个八个位都是零啊,这个表示的是零。那下边。10000000呢,我们让它表示一个最大的负数,因为它是负的嘛,哎,所以这个就表示负128。啊,那为什么他非得表示负128,而不是表示别的,比方说表示负一,表示别,呃其他的一些负数呢?这里主要是考虑到我们整个计算系统的一个延续,其实大家想到负127,如果要补码表示的话,应该怎么样表示呢?首先第一位。
04:18
符号位是一,然后本身127啊,本身原码应该是1111111,那如果补码表示的话,取反再加一,取反全变成零了,再加一,那是不是就是10000001啊。诶,所以大家看到负127是10000001,那负128是不是就刚好是负一百二十一二十七减110000000,对吧?哎,这样的话,我们接下来做这个加减法啊,做这个运算的时候,正负数就完全统一,就不需要额外再去做操作了啊大家也知道这个之所以采用补码进行这个有符号数的表示,主要就是因为整个我们做这个加减法运算的时候可以完全统一起来嘛,啊这负127是这样的表示啊,10000001,那如果要是负126呢。
05:13
大家知道负126第一位还是幺,如果126原码表示的话是111,后面是1110,比比127要少一嘛,那取反之后当然就是0000001,那再加一不就变成了0000010吗?啊,所以大家看到这个补码经过这个转换之后,负127是10000001,负126刚好就是它加一嘛,10000010,哎,那所以负128刚好再加一变成负127,这不就是非常完美的一个显示吗?哎,所以我们一般情况啊,在这个处理BAT类型的时候,它所能表示的范围把它定义成负128~127,而这里的负128具体的写出来的这个底层的补码表示到底是什么呢?其实是一后边七个零,这个大家要稍微的注意一下啊,在有一些场景里边,这个结论还是非常重要的。
06:15
好,那那随之对应的dot它既然是两次解,当然表示的就是16位有符号的补码整数了,那它表示的范围又是什么样的呢?啊,这个大家其实也知道,16位拿出一位来表示符号,那剩下的15位都可以表示数,那当然能表示的数的范围不应该是二的十五次方啊,啊,那当然了,这个二的十五次方最终应该就是零到二的十五次方减一,那二的十五次方应该是多少呢?这个大家要记住一些基本的二的整次幂的结论啊,二的十次方。其实就是1024,也就是我们在计算机上常说的1K,我们一般计算机里边所说的1K就是1024嘛,哎,那所以二的十五次方,其实就是拆开就是二的五次方。
07:07
K。啊,那所以二的五次方又是多少呢?二的五次方,哎,这个大家就常规的简单的这些整次幂要记住啊,二的三次方,把二的四次方16,二的五次方当然就是32了,所以这个数大概就是32K。减一,那所以32K,呃,既然1K是1024嘛,那大家知道32K的话,大概就是32后面呃补三个零对吧?所以大家看到大概就是传说中的32768对不对,那减一的话当然就是32767了,再加上我们之前说的这个,呃,正负零啊,可以拿出一个来表示最小的负数,所以它能表示的区间范围就是负的32768到正的32767。这是short类型,那更加常见的其实是int int,它其实是四个字节,所以它能表示的是32位有符号的补玛整数,那它所能表示的这个数值区区间这就大得多了。嗯,到底这有多大呢?大家知道它能表示的数值区间其实应该除了一位表示符号,剩下的31位都可以表示当前的数值,那31位二的31次方减一又是多大呢?
08:18
那拆开的话,大家其实知道二的十次方是1K,二的20次方,那就是一兆。二的30次方。当然就是1G了,1G大家其实知道是大概是九个零嘛,就10亿啊,那所以二的31次方就是二乘以1G,也就是2G嘛,那当然就是20亿了,所以大概这个具体的数值可能我们记不住,但是大家应该记住一个大概的范围,就是大概正负20亿之间,这就是整数啊,就是int类型能够表示的数值范围,然后当然了,最后还有long啊长整形,长整形的话,那它是八个字节,当然就是64位有符号整数了,这个大家一般可能就不需要专门记忆了啊啊这个,因为这个肯定是一个很大很大的数啊,我们只要知道一般如果要是int表示不出来的,超出了正负20亿的很大的数值的话,那我们用这个64啊,64位有符号补码整数去表示,用一个长整形long去表示就可以了。
09:23
啊,接下来我们还是在代码里边给大家做一个基本的测试啊。同样还是new一个scla的object,当前是TEST07啊,那我们把这一部分就叫做测试数据类型data t直接把微方法写出来,呃,首先我们要测试的是整数类型整形啊,那最简单的整数类型啊,大家可以随便去定义,比方说我这里边先定义一个A1,定义一个A1 BAT类型啊,那其实大家知道,就是我给一个127,这肯定是没问题的,但是假如说我定义一个BAT类型,如果要给128,看到抛出了当前T,我们说BAT的类型它只有一个字节,它是负128到正127嘛,哎,这个时候你如果要是直接定义128的话,我们看直接报错了,编译器告诉我们当前128,你应该要用一个int数据类型去做一个表示,而不能直接把它定义成BY。
10:30
啊,那所以如果这里边你给负128的话,这个没有任何问题对吧?啊,所以这个大家要稍微的注意一下啊,这里边如果说我们用了BAT类型,如果等于128的话,我们写一句这个是错误,把它注掉,然后接下来除了这个BAT数据类型之外,当然还有dot映尘了啊,他们对应的这个数据类型大家也可以直接做一个测试啊,就不能超出具体的这个类型,那这里边大家需要注意的是,假如说我们这里边,我们前面不是提到过后边的数据类型编译器可以做自动推动的类型推断吗?诶,那如果我直接定义一个A3等于12,它对应的类型应该是什么呢?
11:19
里面大家也看到了默认啊,直接给一个整数的时候,默认的类型是int整数默认类型为定啊,这主要也是考虑到后续我们做这个计算啊,对应的一些其他操作会比会比较方便一些啊,那有同学可能就想到了,那假如说我当前四啊,给一个很大的整数看,如果给一个明显超出正负20亿的一个整数的时候,大家会看到这里边他直接报错了。哎,我们直接如果运行的话,显然这里边编译器也是通不过的啊,那咱就说当前的这个inte number啊,整形的数据太大了,那怎么办呢?哎,当然就是说你这里边不能默认它是int,那就必须在后面要加上一个L导式,它是一个昂整形啊,当然就是说我们给这个大写L小写L都都行都可以,但是一般情况小写L因为容易和一它的一些字母的一些混淆,所以我们一般是用大写L来表示长整形,所以这就是长整数值定义,但有同学可能想你之前这么写的话,那是说因为你要让它自动类型推断吧,是不是我直接前面直接把它的类型定义成了没事了呢?
12:50
量也不对,对吧,看到对于编译器而言啊,我们这里边一个整数,它默认就是把它当成int来处理的,然后呢,是把这个int类型的数,数值又要赋给这个长整形的变量,哎,所以当前还是不对,所以你如果想要对它进行处理的话,一定要把它定义成长整形的数据,哎,这是关于这个数值定义的过程啊,然后另外还涉及到一点就是哎,我们知道这个不同的。
13:20
数据是可以做这个四则运算,可以做相关的这些处理的,那假如说这个时候我们另外定义一下啊,定一个10,首先把它先定义成一个bit的数据类型,然后接下来我们可以定义一个B2啊,对这个B2,如果说大家想我如果直接定义一个表达式十加20的话,那它默认的类型其实应该是。应该是int,应该是这个四个字节的整形对吧,那假如说现在我要把它定义成,因为我想到十加20只有30啊,用一个字节就可以表示,那我直接定义成fat行不行呢?诶这里大家看到编译器直接给我们报错了,哎,这里边说它应该是一个int类型。
14:12
告诉我们应该要把它定义成int,但其实如果这里大家直接做一个运行的话,你会发现它是不报错的哦,甚至大家如果觉得这个不太确定的话,我们可以直接把这个二做一个打印输出。我们看一下B2的值是不是直接能够算出来一个BAT类型30没有问题,所以大家要注意一下啊,这里边ID2里边直接是给我们报错显示它有问题的,让我们需要做这个类型的转换,但事实上对于这个呃,本身的SKY拉编译器啊,它是可以去处理的,因为这里边十加20这个值它是可以直接计算出来,可以判断我们当前的值的范围就是在BAT能够表示的范围内的,所以这个其实是没有问题的啊,这里边的编译器报错其实是因为idea对于scla的支持还不到位啊,就是当前我们这个插件啊有一些。
15:06
有一些具体的小细节没有处理好,因为这个导致啊,这大家要稍微的区分一下,然后另外还有一点是需要给大家说的是,那有同学可能想了,那我直接还是定义一个B3是一个BAT类型,我现在如果直接用的是前边的B1加上一个20,这个可以吗?诶大家可能看到了,就是当前同样前面B2一样也是编译器报这里边ID啊,IDE给我们报错了,那是不是它也是假的,直接运行可以通过呢?运行,大家会发现这个真的通不过了,编译的时候真的告诉我们需要的是一个BAT,我们这里面传了一个in。这又是为什么呢?哎,其实大家仔细一分析就能发现啊,前面这个十加20编译器是可以直接给我们做计算,然后判断它的范围在BAT范围内的,而现在如果是必一加20的话,这是不是必须要到运行时?
16:07
就是直接把这个B1的值拿过来,做完计算,我才能知道B3的值到底是是否在范围内啊,哎,所以大家要注意啊,这种写法是不对的,不能直接这么去做这样的一个定义啊,那当然有同学可能想,那怎么写就对了呢?啊,对应的这个写法也可以。也可以让它ne不报错,那对应的这个做法当然就是强制类型转换了,好在R里边的话,强制类型转换基本数据类型,你前面可以直接给一个这样一个一个应这个BY对吧?啊这样去做类型转换,S scla里边不是这样的写法,它是把对应的这个答是你先括起来,然后后边呢,直接照它的方法,比方说to。这就是做了一个转换成BAT类型的强制类型转换啊,所以大家看到在skyla里边就是所有的这种操作啊,所有的转换各种这个操作都是一个方法调用啊,当然了,呃,这一部分啊,关于类型转换这一部分,我们会放到后边给大家一起做一个对应的讲解,这就是关于整数类型的具体的一些操作。那另外还有一种数值类型也比较常见,我们可以一起做一个简单的介绍,那就是浮点类型啊,大家知道对于小数的处理,在计算机里边啊,我们需要用这个浮点类型做一个表示,那呃,对于这个scla而言呢,它的浮点类型跟Java也一样啊,主要就是float和DOUBLE2种类型,那对于一个简单的浮点类型来讲啊,比方说我们这里边随便定义一个1.2345,那大家可能会想到目前的这个F1应该是什么类型呢?是float类型吗?
17:58
大家会看到不对,对吧,目前那个整数类型一样啊,一开始我们如果什么都不给类类型的话。
18:07
给一个整数,它默认的其实就是int,而这里边如果我们什么类型都不给的话,给一个小数,默认的类型就是就是double啊,所以如果说你想单独定义这个呃,一个float类型的话,那必须在后边再加上一个F,不是这是一个float类型啊,那当然了,如果说你想要去定义一个double类型的话,那就不需要了啊,随便直接写出来,这就是一个double类型啊,这是完全没有问题的。啊,就是关于浮点类型的定义,数值类型的话,主要就是这六大类。
我来说两句