00:00
那同学们我们看一下啊,基本数据类型转换基本使用我们知道的,那么还有几个细节,还有两个练习题呢,我们待会儿做一做,看第一个细节。告中数据类型的转换可以从这个表示范围小的到范围大的。比如说刚才我们可以把INT32交给INT64,也可以把int范围大的交给范围小的,这是可以的,你比如说刚才我们讲到。把INT32交给64,是把是把小的给大的,同样把这个INT32交给INT8,其实是把大的交给小的,对不对,所以说它是允许这个这个这个转换的,第二个呢,同学们要注意一个细节,被转换的是变量存储的数据及那个值,但是变量本身的数据类型并没有发生变化,这一点是特别容易让我们初学者。搞混淆的地方,这是一个重点啊,很多面试官喜欢问这个问题,怎么个意思呢?各位朋友,也就是说你这个I转换过后,其实是把这个I转换这个值转换成一个INT64,交给了N3,但是I的数据类型仍然是32,这个能理解吗?就转换完了过后这个I仍然是32,它只是把I的这个100这个值转成了64位,交给了N3。
01:25
所以说这个I的本身数据类型呢,并没有发生变化,它只是转完了过后交给了N3,但是I本身的数据类型并没有发生变化,我们看一下注意啊,我们说到这一点大家一定要注意。哎,这点呢,是特别容易让我们忽略的地方啊,很容易。这地方被混淆,那么我们输出看一下啊。What?点print LN,我们看看这个I的数据类型。Type is啊,我把它输出来还是老规矩T。
02:00
同样我们格式化输出对不对,好为了好看呢,我前面加一个换行,好输出我们这个I。同学们看一下效果,执行一下吧。看效果啊,我们可以看到I仍然是什么呀。大家看这里。I的type仍然是32位,并没有发生变化,能理解吧,所以这点呢,同学们一定要小心啊小心,所以这里呢,输出呢仍然是32位。INT32。明白,好,这个是个细节问题啊,我们再看还有需要注意的,在转换中,比如说把INT64转成INT8,编译时不会报错,诶,这个地方是有个问题的啊,同学们大家有没有仔细考虑这个问题,比如说INT64能存一个很大的数,但是INT8呢?它能存的数的范围是什么呀?还记得吗?它是不是能够存这样一个范围的,是负的128?到正的多少127还有印象吧,因为它是一个有符号的数,是不是?但是假设我这个INT3 int64的值是一个很大的值,我交给INT8,它会怎么办呢?就是这个编译器会怎么办呢?好,告诉大家,它是这样子的,编译时不会报错,只是转化的结果呢,会按溢出处理,他和我们希望的结果不一样,就是它不会报错,只是这个转换的结果绝对跟我们想的不一样。
03:23
能理解吗?好,同学们,来把这个案例给同学们再做一个演示,注意听讲。好,同学们,我放到这里啊,各位听视频的同学请注意一下啊。呃,这个视频是专门为你们录制的,明白注意听,那现在看啊,假设我有一个值VR number1。对不对,我有个英特64位的。64位的呢,我给他一个很大的数。99999,注意这个值在英特64可以存放,现在呢,我要做这样一个动作。比如说我直接有个number。二。
04:00
但鱼我怎么做呢?这样子啊,我直接把它类型定下来,INT8我等于什么呢?各位同学看INT8。转NUMBER1,同学想啊,这个地方NUMBER1的值已经是这么大了。他显然已经超出了这个范围,那么这个时候编译器你看他没有报错。那么这个编完了过后,这个又存不下来,他怎么办呢?他会按照溢出处理。所以这个结果呢,绝对不是我们想的这六个九,而是别的值,我们看一下这个值就按一处处理,这个值是不可确定的啊,我们来输出一下。大家看一下。NUMBER2等于。好,我直接输出NUMBER2看效果,朋友们。看效果走。我们可以看到NUMBER2转完了过后它是多少63,显然跟我们想的完全不一样是吧?诶,那怎么得到63的呢?同样啊,就是告诉大家它是按溢出处理的。
05:01
溢出处理,这个怎么溢出处理我们就不去研究它了,反而呢,反正大家在转的时候一定要特别小心,一定要保证。他们相互转换的时候,这个能够转换数据是对方可以接受的范围,你不要乱搞啊,对不对,你比如说我强制要把这个大数转给一个很小的数据类型,那你怎么办呢?他就溢出了,溢出过后这个结果你看。63对吧,这个63的结果呢,说实话就是按照它二进制的艺术处理,具体。在二进制的时候,大家可以再去研究一下啊,所以说大家要注意这个问题,不要什么都强转,对不对,好,那么关于它的这个细节,关于我们这个基本数据类型相互转换细节呢,三点大家注意一下,我把这细节给大家放到笔记里面来,注意听讲。好,我们。数据啊,基本数据类型啊,相互转换。
06:04
啊,转换的这个注意事项。注意啊事项。好,我把它呢整理到我们的笔记中。对吧,有几点,一共有三点啊,需要同学们注意第一点。第二点,那么后面呢,我这儿也给大也给大家做了这个几个案例,好看这个案例。第一个案例我就不说了,对不对,在前面已经举过例了,第二个案例,我把第二个案例呢给同学们放到这里来。再看这里啊。看这里,原先这个I。原先这个I是32位,那么这转换完了,这个地方同学们看到啊,I仍然是32位。INT32了,所以说没有发生变化,它转换的是把这个I的值转成了一个INT64,再交给N3,但是I本身的数据类型怎么样,没有发生任何变化。
07:00
好,这是第一个需要同学们。有一个认识的。好,第二个呢,在转换的时候啊,如果真的是什么呢?就是呃,数据不能存放进去,它会按溢出处理。但是呢,它并不会编译报错,注意这个问题啊,所以大家在使用的时候要注意范围问题,因此注意听啊,因此在转换时,在转换时需要考虑,需要考虑。考虑什么呢?范围明白需要考虑范围啊,好,我把这个地方也给同学们放到笔记里面去,范围的问题。好的。好,你看这个地方输出的其实就是64了,63对吧。这个地方NUMBER2,它输出的是NUMBER2,它是输出了一个63。显然跟我想的六个九是不一样的。我把它放在这里。没问题吧?好,这是细节啊,同学们要注意一下。
08:02
好的,那有这个问题了,过后呢,我们再来看几个练习题,大家听到这儿呢,听的有点有点犯困了,对不对,我呢给大家出两个题,大家看看你们能不能做出来,我们看第一个题。第一个题大家先观察一下,给大家。30秒钟看一看啊。大家先看这个编译能能不能通过。编译能否通过?看一下。看一下。如果编译通不过,又怎么处理?好。因为我这是录视频啊,你们可以先暂停一下,然后再听老师的讲解,明白我意思吧,就说你们不要先听老师讲解,你们可以暂停一下视频说诶,我先想一想,然后再听韩老师讲怎么去。怎么怎么怎么一个结果好,首先看这个,这句话肯定没问题,我把12交给特三二没问题,这个也没问题,默认值为零嘛,就是这个N2默认值为零,N3也没问题,这个地方默认值为零,对不对,注意看这句话。
09:06
这句话是N1加上20。问题来了,大家知道N1的类型是什么?64。那么一旦这个这个int n1是64 int64的话,再加上这个20,整个这个数据类型,注意听讲。整个这个数据类型也会变成INT64。注意啊,注意它这个规则就是它有个数据类型是64,再加上一个具体的数呢,它仍然整个这个结果是INT64,而我们的N2是多少。啊,注意看啊,对对对,说错了啊,这个N1是32位啊,注意听说错了啊,刚才不好意思啊,32位。那整个这个结果呢,就是INT32。那么你这个N2呢,是64,你N1是六四,N1是32位吗?再加一个20还是32位,所以说整个这个结果同学们相当于说把INT32交给一个INT64,所以说这个地方编译就会错误。
10:06
编译就会错误,同样下面也是一样的道理,下面N1加上20,整个呢也是INT32,因为N1是INT32。它加一个20,它还是INT32,那么交给了N3 N3是INT8,所以说这地方又会错,为什么呢?因为你相当于把一个INT32交给了INT8,因为三是INT8,所以说这个也错,因此同学们注意听,其实说白了这两个都是错的。这个是错的。这个也是错的。能理解吗?好,那么同学们不相信的话呢,我们来测试一下。啊,我们来测试一下啊,来同学们注意听。嗯,我就在下面吧,啊把这个测试题写到这里,测试题。测试题的这个评价。好,注意听讲啊,各位同学注意听讲,那我把这个案例呢,就直接拿过来了,因为时间的关系,对不对,我把这段代码怎么样复制粘贴到我们的笔记中去。
11:08
复制粘贴的比中去。对吧。OK。放下,因为前面有没有N1N2,诶这个还有点麻烦啊,因为前面我们有这个相同的变量,那这样子吧,我们干脆新建一个文件夹,叫做我们的练习题好不好,诶把练习题写到这里面去。新建一个文件夹叫练习。比如叫我们的这个课堂练习啊,EXEEXE啊。练习。好在这里面呢,我们写一个文件对吧,主函数。没点go。好的,然后呢,我把这个地方打一个包,Package me,然后呢,我们import。对吧,把这个包包引进去format,然后呢,写一个。Function叫me。
12:01
包起来往下写,好,把我们的这个练习放到这里啊,练习题,课堂练习,注意听。放这那同学们来看一下啊,此时此刻我们把这个代码呢,整理一下,这个代码有点乱怎么办啊,按table键,注意听按table键啊,整理代码按这个table键。Tab这个键就可以了。好,同学们看,我们现在编译一下,因为发现这报错了,大家看这个错误错误提示信息。好,我们先保存一下,诶来了啊,第一看这里,他说注意看这这个提示信息是什么,他说N1加N2,等于是整个类型是INT32,把INT32不能交给INT64,是不是跟老师说的这个道理是一样的呀。也就是说这个地方它的错误是。INT32。交给了这个INT64,所以错了。错误理解,那么在这边也是一样的,他说把INT32交给int int8也是错的,说这个呢一样错。
13:01
这个是不是有点怪啊,你们感觉很奇怪,但是构语言就是这样子的,它是一种强制性的简洁语言,就你必须。按照这个方式来做,他就把32位你交给了谁,你交给了一个INT8也是错的。好,这两个都是错的。说这个结果呢。大家都知道了,都是错的啊,好,我们把这个作业先放到这里。堂练习啊,课堂练习。课堂练习。好,我整理到这里来。我们的第一个。题是吧,第一个题是错的,那为什么错了,我把这个原因呢也给同学们写出来了。好,原因是这样子的,刚才已经分析出来了啊,错的。这个也是错的,因为你这个N1是32位的加上一个数,整个这个类型还是T32的,明白吧,那问题来了,你既然错了,你怎么去修改呢,就怎么改一下就可以正确呢?同学们动脑筋。
14:02
怎么修改就可以正确呢?如何修改呢?如何修改上面的啊。上面的代码就可以正确呢,就可以正确呢。好,那同学们看我们是不是刚刚学过转换啊,你既然这个N2。N2是64位,那我很简单嘛,我这样做,我把N1。我把N1转成64。包起来,这不就完了吗?N1转成64,再加一个20,整个还是64,再交给INT64没问题,这个也一样的道理啊,N1你交给N3 N3是INT8,那我就这样子呗。对吧,这样不就完了吗。好把它输出来一下。说出来一下,Print n2,我就这样说啊,N2等于N2。再来N3等于N3,看看还有没有问题,保存一下能有问题吗?没毛病,分析一下吧,朋友们。
15:06
运行一下点点好,我们回到ex e run一下好。看效果。你看。这个结果没毛病吧,32 32都正确。所以说这地方怎么去处理,明白了吧,好,这个事我们如何去修改,修改完了过后就正确了啊,这样就正确了,好这样这就正确了。这样就就正确了啊好,我把这个呢。写到这里来。这是老师的又一个小案例,对不对?好,这个就OK。这个呢也OK了,因为我强转了。对不对,我显示转换修改成这个样子就可以了。那下面呢,我们再来看第二个题,同学们。我们再来看第二个题,第二个课堂练习题,第二课堂练习题这样子的啊,他说N1T32,大家跟上老师思路看一下,你们觉得对不对,这个这句话肯定没问题,这句话也没问题,这句话也没问题。
16:03
对吧,然后呢,大家看他把INT8。他把N1。N1转成了INT8,再加一个127交给N4 N4本身,注意听N4本身就是英特八,所以说。我把N1。N是INT32转成了INT8,再加一个127,所以整个这个结果呢。是INT8,而且呢,大家看到N1它本身是一个默认值为零啊,N1默认是12对吧。N1,注意看N1的这个值现在已经是12了,加上127。显然。这个交给N4。能行吗?是不是有点儿。超这个溢出的问题啊,但是他在编译的时候,它是不会出错的,他在编译没问题。
17:01
编译没问题,再看N3N3T8N1,注意看啊,N1这个地方它是12,嗯,这个三也是INT8,所以说这个呢,类型是匹配的,但是大家看这里。这里有个128 128在编译的时候,他发现128已经超过了N3的范围,所以这个连编译都过不去。我再整理一下这个思路啊,就这个地方。就这个地方。告诉大家这。这个地方编译是可以通过的。但是呢,会发生溢出,编译会通过,但是结果,但是最后这个结果啊,就是你这12加上121超过了N4的这个范围是吧,所以说但是这个结果呢,不会像我们想象的是127加这个128 127加12的,它有个溢出的问题。
18:00
啊,这又回到原先说的问题了,就是他会,他会按照这个溢出来给你一个结果,但是结果不是他,但是结果绝对不是这个啊,结果不是他。结果不是这个,它是按溢出处理的,那这个地方呢,问题就更严重了。这个地方问题更严重,这个问题为什么呢?你看啊。你这个类型是匹配的,我承认N4和N三都是英特八,你也转成英特八了,整个结果也是英特八没问题,但是这有个128,这个时候编译都通不过。编译器一看,哎,你这个128怎么能交给N3呢?因为你N3本身最大只能表示负的128到正的127,你都已经越界了,说编译器就通不过,编译不过。都通不过。那是不是这样子的呢?我们来给大家看一下代码是不是跟老师这个。呃,分析的一模一样。注意听啊,注意听。
19:01
好朋友们,我把这个代码呢给同学们放到这里来。好,看老师刚才的分析。好,为了好看呢,我先把这个先注释一下。好不好,先注意一下,把代码往这一粘。好,我们来跑一下,同学们看这里,我们看哪里会报一个编译错误,看这啊。无效啊,这个地方是这个问题啊,大家看这个地方的问题呢。跟这没有没有关系,是因为我从那边粘过来,它带有格式,同学们在做开发的,如果遇到这个问题啊,报告一个什么无。无效的看啊,它是一个什么,这个character什么什么,一般都是字符集的问题,那怎么办呢?好这样好办啊这样做。顶到前面去,看到没有?顶到前面去,把这个乱七八糟的字符给它清掉。清掉啊。清掉,追听清掉。它这边有些乱七八糟的字符,你看不见的再保存,保存完了过后再用把它选中,然再按这个table键就可以了,你看这个时候报的错误呢,只有这一个地方了,哪个地方就是这,大家看这里,他说CONSTANT128 overflows8。
20:16
因为他在编译的时候,他发现你的128已经超过了N3可以接受的范围,其实这个地方也会超过,因为你127加上一个12也会超过,但是编译器检查不出来啊,编译器也不是像我们想的那么智能,但是在运行的时候它会按溢出处理。会按什么呢?按艺术处理。溢出处理好,同学们,我们来先看看是不是这样子的啊,来,我先给大家打印出这个N4。你们看看这个N4的结果是不是。这个121加12呢,那这个N3我们先把它注销一下。因为你没用到它来回报错走一个。跑起来,同学们看效果,你看。
21:01
你看怎么变成负的117了,很奇怪的,嗯,所以说它是按溢处处理的,所以再次提醒我们在用用这个数的时候一定要小心范围对不对?小心范围好,这个练习题呢,我们就说到这儿,那有些同学老师那这编译通不过怎么办呢?你就不要这么用嘛,那就就错了嘛,不能这么用,明白吧,你可以把这个N3的范围扩大一点就完了嘛,是不是这个道理啊?好,我们把这个这个题的这个评讲呢,就先说到这了啊,评讲就先说到这了。好,我把这个地方的评奖给大家分析到这里来。好,这个地方的结果就是刚才我们分析出来的结果,一个是这个。一个是这个啊,为什么编译不够,就是直接检查出来128超出了N3的范围。好,我把这个题呢啊,练习二放到这。练习二。好,这个上面是练习一对不对,练习一。
22:02
练习一好练习一,为了整理好好整理呢,我给大家一个小小的箭头。这边呢,也给他一个小小的箭头。哦,这样排版看起来比较舒服一点。好的放这儿,然后把它整理一下。看清楚没,这两个题啊,这两个题是怎么来的,这两个题是怎么来的,好的,那这个呢,我们先把它保存一下啊,保存一下。啊,这地方可能会报错啊,报错我们先把它注销了,不然的话,整个这一大坨全是这个红色很难看的,对不对,所以老师呢,先把这个注销了。啊,先把先把这个评奖,评奖了的题呢,我就整体注销。好吧,因为笔记里面我也记得有了。好同学们,诶怎么还有红色啊,看看哪地方还有错哦,这地方没有用过啊,他说你没有用到这个format,那怎么办呢?好两个后面我们再讲啊,其实你可以加一个这个。再一个这个就就可以不出错了,呃,还没讲到这儿来,我提示大家一下,如果我们没有用到一个包前面。
23:05
来一个下划线表示忽略,就是不用它啊。如果我们,如果我们没有使用到一个包啊,没有使用到,但是呢,又不想删掉,但是又不想。又不想删除啊,又不想这个去掉,去掉什么呢,前面加。加一个下划线,这个下划线呢,就代表什么呢,我先暂时不用它啊,忽略表示忽略。表示忽略。OK。注意这个细节啊,后面我们还会具体再讲这个包的内容。好了,同学们,那关于我们这个基本数据类型的使用的一个,呃,细节和课堂练型呢,老师就给大家先介绍到这里,大家要认真的体会一下啊,同学们啊,不要小看这些基础知识,它是对我们后面去学习go的项目和高级部分是非常有有用的。
24:06
好,就先说到这里。
我来说两句