动图在线制作网站,黄石城乡建设网站,网址短链接生成器,漳州 网站建设公司哪家好Day4 运算符和数据转换 今天来讲运算符#xff0c;每个运算符的作用和现象#xff0c;首先我们先复习一下数据类型#xff0c; day2讲过基本数据类型有八种#xff0c;int、short、long、byte、char、boolean、float、double#xff0c;分别为四个整型、一个字符型、一个布…Day4 运算符和数据转换 今天来讲运算符每个运算符的作用和现象首先我们先复习一下数据类型 day2讲过基本数据类型有八种int、short、long、byte、char、boolean、float、double分别为四个整型、一个字符型、一个布尔值、两个浮点型 第一章 数据类型转换
为了对数据类型更加的熟悉我们再用一种列表的方式呈现
数据类型 整形 byte、short、int、long 浮点 float、double 布尔 boolean 字符 char
数据类型转换正常情况只能同类型转换多个数据类型互转也是可以的。
首先我们来说一下整形的这四个分别是byte(1字节)short(2字节)int(4字节)long(8字节)我们直接写的数字例如 int i 123 的这个123就是int类型如果在不超范围的情况下我们是可以把这个赋值给更小的数据类型的然后想要写long类型是稍微需要一点特殊手段比如在末尾加个 l或者L, 比如 long l 123456L 和 long l 123456l
在我们给更小一点的数据类型比如short和byte只要我们不超上限就可以使用int类型的数据直接赋值但是如果超了的话就需要强制类型转换
public class Hello {public static void main(String[] args) {//很正常的声明和赋值int i 456;//报错byte b 456;}
}明显可以看到直接就是一个报错正确的写法是这样
public class Hello {public static void main(String[] args) {//这个就是强制类型转换通过括号扩住里面写要转换的类型byte b (byte) 456;//因为byte只有一个字节所以他的范围是-128~127超了范围就不行//但是如果没有超出范围的话就是可以的byte b1 123;//对应的还有short//这里就会报错但是我注释掉了你们可以解除注释//short占2个字节也就是-32768~32767//short s 45645;//所以需要这样short s1 (short) 45645;System.out.println(b: b);System.out.println(b1: b1);System.out.println(s1: s1);}
}出现了负数但是你们先不要惊讶和失措因为这个是正常现象我们来分析一下比如这个b一开始是不是456但是我们进行了强制类型转换从int的456变成了byte的456因为byte是-128~ 127所以是256个数我们的456是溢出的所以就是456-256200但是200对于byte的正数上限127还是溢出的所以200-256-56
下面的s1也是同理因为short的范围是-32768~32767所以我们的也是用同样的做法减去他的最大个数45645-65535-19891
其实还有一个数据类型我们还没有进行展示那就是long类型long类型比较特殊因为他是八字节所以最大值是9,223,372,036,854,775,807所以他完全能包含int类型的四个字节最大值是2,147,483,647当我们直接写数字的时候例如 456123 其实写的就是int类型但是我们写超过int类型的最大值也就是(2^31)-1那就是会出问题我们来做个测试
public class Hello {public static void main(String[] args) {//正好就比最大值多了一个数int i 2147483648;}
}也是有问题的所以这个时候我们就需要使用long类型去接收了急着测试的小伙伴们先别急你这下long替换掉int还是会出问题的因为我们写的正常数就是int类型本来就是超数据的
所以我们需要的操作就是把我们直接写的这个数变成了long类型的数这个操作其实不难很简单只需要将数字的末尾上面加上一个 l 或者是 L 就行我们之前在上面其实也讲过了不知道还有多少小伙伴是记得住的我们在写数字的时候直接加上这么一个L就可以解决直接写的数是int然后导致大于int最大值就无法赋值的的这个问题不过自然我们还是可以原地tp的看代码
public class Hello {public static void main(String[] args) {//我们现在使用L进行赋值long i 2147483648L;//自然我们使用int的时候也是需要使用强转的因为直接写的是longint i2 (int) 2147483648l;System.out.println(i: i);System.out.println(i2: i2);}
}自然这个出现了-2147483648也是和之前一样的算法就能算出来大家伙可以自己试一下不加这个强转会不会报错答案是肯定会报错的
通过整型讲完的最复杂的转换方式其他的大家伙应该可以很好理解了现在我们要说的是浮点型的转换我们还没有使用过浮点型但是没有关系接下来会使用大把大把的浮点型来写程序
首先先提一嘴就是我们直接写的浮点类型就是double是八个字节的也叫双精度浮点型因为double的这个双我们想要把他变成了float需要加一点东西然后还有一个就是整型到浮点型的转换
public class Hello {public static void main(String[] args) {//注意看我这里写的是123所以其实就是int类型//但是int类型是四个字节的然后double是8个字节//所以可以轻松接收即使我现在用float也是一样double d 123;//也是没有任何的关系的因为float本身也就是四个字节的//虽然其实你用long类型用float也可以接收一般我的评价就是//浮点的事你少管管好整型就好float f 456;//现在要来说说什么情况才是double类型就是这样//但凡你加上一个.x无论是什么数都是可以变成浮点型的doubledouble d2 456.0;//但是我接下来写的这个就会导致报错我希望你们能比较熟练的使用注释给他注释掉float f2 123.0;}
}看看兄弟们是不是报错了因为这个其实就和你把int赋值给short和byte是一样的把long赋值给int一样自然是说大于他们最大值的时候的情况然后这个为什么就加个.0就会出问题的
其实啊即使就只是加上个.0也是说明是双精度的浮点单精度还是容纳不下双精度的大小的所以就会出问题那么有些小伙伴就会有疑问了那我使用 (float) 123.0 然后再赋值是不是就可以了
我只能说嘿小伙子你还真是个天才哈是可以的但是我们一般使用的解决方案并不是这个虽然这个也可以但是我们有更简单的解决方案就是在末尾加上一个 F 或者 f和long一样很明显能看出来long的那个L就是long的开头字母这个也是就是float的开头字母
public class Hello {public static void main(String[] args) {float f 15263.0F;System.out.println(f: f);}
}是不是没有一点毛病
接下来就是一个既不是很难也不算很简单的点了那就是char类型的转换因为char类型是字符所以其实他写起来应该是这样的 a 但是他的这个a本身又是一个数详情可以查看ascii码因为这里还是处于ascii的范围内现在用的unicode都是在ascii的基础上做添加的这两个都是编码然后他们又是有对应的数的就比如我现在要把char类型的 a 转换为int类型的数字也是可以的
public class Hello {public static void main(String[] args) {char c a;//这里也是可以正常打印的但是还是可以做其他的操作System.out.println(c);//比如将它转换为int类型然后再来打印其实打印的就是数字了System.out.println((int) c);}
}这里a显示97的原因大家可以查看这个 ascii的百度百科 自然我也是把截图截下来了
所以大家只需要知道char类型和int类型是可以互相转换的这一点是比较重要需要记住的。
public class Hello {public static void main(String[] args) {int i 98;System.out.println((char) i);}
}是吧98就可以直接换成b了对照表上
还有一个特殊的那就是布尔值布尔值本来就只有true或者是false的两种选择但是我们正常的数字和字符的强转和其他的都是变成不了为布尔的需要用到接下来要学习的内容——运算符
还有一点我没讲的但是是很简单的比如我把 byte b 123; 的b赋值给 short s b; 这种就叫做隐式类型转换把小的byte赋值给了大一点的short值的类型从byte变成了short还有 11.0 会是 2.0因为intdouble然后double是八个字节所以发生了隐式的类型转换只有写上了 (类型) 的才是显式类型转换也叫做强制转换
public class Hello {public static void main(String[] args) {byte b 123;//刚刚说的把b赋值给s是将byte隐式转换为short//但是现在的操作是byteint变成了int但是值被锁定成了int//所以现在的就是需要把int强转变成short//我们需要把他运算完的结果进行强转所以要加个括号效果和数学里面是一样的short s (short) (b 7);//还有一个也是小大变成大的也是我上面说过的//这里我们直接打印还记得吧打印里面可以放运算式的System.out.println(1 1.0);//答案是2.0}
}第二章 运算符 经过了类型转换的学习对以后的学习和写代码都是很有帮助了还是需要自己给自己出题然后训练能做到这一点说明自学能力不错。 这一章我们要学习运算符其实就是加减乘数然后再有一点新的内容 运算符 赋值运算符算术运算符自增、自减运算符关系运算符逻辑运算符位运算符复合赋值运算符三元运算符圆括号
赋值运算符
首先我们说一下赋值运算符其实在前面的演示也已经够多了因为就是一个等于号 比如前面的 int i 50 那这个等于号就相当于把右边的那个50赋值给了i然后在等号的右边也可以是算式比如 1 2
算术运算符
第二个我们来说说算术运算符其实就是加减乘数用过电脑上的计算器的应该都会的其实就是加减乘除 - * / 还有一个 % 是取模优先级和数学里面是一样的先乘除后加减。
我来浅讲一下取模就是 余数还记得小学学的东西吧那个时候没有教小数的时候比如5/2是不是就是5/22···1就是余1那就是1这个就是取模的作用
自增、自减运算符
第三个我们来说一下这个自增、自减这个可是一个小难点我先说一下写法 和 -- 假如我们有这么一个数 int i 1 那我的使用了 i 和 i 之后最后的结果是一样的但是我们放在式子里面去计算就不一样了然后这个 -- 的作用和 是类似的只是一个是加1一个是减1罢了
public class Hello {public static void main(String[] args) {int i 1;//不一样的从现在开始System.out.println(i: i);System.out.println(i: i); //这里可能会有歧义最好是把i使用括号括起来/*现在我们来讲特殊的情况第一个打印的i会是1然后过了这个打印之后i的值就变成了2第二个打印会打印3。不知道通过的我描述能不能看懂这两个的作用呢我们把放在后面的话会做完一系列的计算啊和打印啊等等操作之后才会自加但是在前面的时候在做任何操作之前都会先自加所以就导致了1和3的情况接下来我们看结果*/}
}-- 也是同理比如我们现在有个数i的值是5我先 --i 然后 i如果打印的话那就是 4 和 4 然后i的最终结果是 3
关系运算符
第四个我们现在来说一下这个关系运算符这个就和布尔值有关系了那先来说说有什么关系运算符
关系运算符 !
直接读符号就能大概明白意思了比如 等于等于连等那就是判断是否为相等这个时候就需要说到布尔值的那两个了true和false如果确实相等那就是true如果不是那就是false都是这么一个关系 读音就是大于那就是判断是否为大于正确返回true错误返回false比如 5 3 那就是true 读音就是小于那就是判断是否为小于如果正确返回true错误返回false同理我就不举例了 根据读音就是大于等于就多个了等于操作 小于等于也是小于上面多了个等于的操作
! 这个叹号代表非的意思所以就是不等于的意思 5 ! 3 那就是true 5 ! 5 那就是false
public class Hello {public static void main(String[] args) {//记住加上括号如果没有括号的话说明就是先拼接字符串然后拿字符串去和int类型判断了//这样自然是判断不了的System.out.println(5 3: (5 3));System.out.println(5 3: (5 3));System.out.println(5 3: (5 3));System.out.println(5 3: (5 3));System.out.println(5 ! 3: (5 ! 3));System.out.println(5 3: (5 3));}
}逻辑运算符
第五个就是逻辑运算符逻辑运算符就只有三个但是会导致非常多的逻辑详情可以去看看逻辑电路我们程序里面只有三个短路与、短路或和非为什么会有短路是因为和正常的与或非不一样他们的符号分别是
逻辑运算符 与 或 || 非 !
我们换一种说法更能理解的那就是与就是和或就是或非就是反我们举个例子 这个符号的作用就是连接两个 需要前后两遍的表达式都是true才会返回true但凡有一个false那就是false所以就是和
我们在看或是 || 作用也是连接两个但是先后的关系是 或 的关系两者表达式但凡有一个true那就是true
还有一个就是 ! 其实就是取反如果你出来的结果是true那就会变成false如果你出来的结果是false那就会被叹号变成true比如 !true 那就是false
public class Hello {public static void main(String[] args) {System.out.println(true true: (true true));System.out.println(false true: (false true));System.out.println(false || true: (false || true));System.out.println(true || true: (true || true));System.out.println(!true: (!true));System.out.println(!false: (!false));}
}位运算符
这个东西就是想当炸裂了就是操作二进制的。我们先说明他的符号然后我们再做举例说明然后我们再使用代码的方式给大家展示。
我们先说符号分别是 、|、^、~ 分别的意思也是与、或、异或、非 。
然后我们举例说明首先在举例之前还是需要学习一个东西那就是二进制的编码分别是三个码 原码 反码 补码 然后这三个码还分正数情况和负数情况负数不一样正数三个码都是一样的负数在原码和正数不一样的只有符号位然后在反码是除了符号位之外全部翻转补码就是反码1然后计算机上的任何计算都是从补码进行计算的如果你算完之后的结果的符号位还是1说明他是负数还是需要做翻转。我知道现在看的人有点懵但是你先别懵看我后面的例子
源码的举例说明我们举例5和-7这两个数然后我们现在使用1个字节去储存这个数
我们先看5的编码 0000 0101 原码 0000 0101 反码 0000 0101 补码 看出来了吧这就是正数的三码合一然后我们的负数又是不一样的就是我上面说的情况我们再来分析一下
-7的编码 1000 0111 原码表示和正数一样但是符号位是1正数是0 1111 1000 反码除了符号位之外全部翻转 1111 1001 补码反码1 我们还有一个工具可以来验证这个东西就是我们的windows自带的计算器的程序员功能就像我说的计算机中存储和运算都是通过补码的方式存储的如下分别是5和-7 很好你已经会看补码了那我们说明完 | ^ ~的作用后直接开始运算好吧他们的运算都是上下对着运算如果你让byte类型和int类型互相做位运算的话他会补齐到int的32位也就是4字节进行运算
首先是 他的结果是这样的同一出一不同出零这个意思就是理解为1和0乘法1 1 那就是 1 1 0 那就是 0
然后是 | 他的运算规则就是有一出一全零出零可以理解为加法但是最大值是1所以 1 | 1 1 1 | 0 1 0 | 0 0
第三个就是 ^ 他的运算规则是不同出一相同出零 1 ^ 0 1 0 ^ 0 0 1 ^ 1 1
最后一个就是 ~他就是取反但是他的取反和负数的反码对原码取反不一样因为他是将符号位也取反
很好现在你们已经会了可以写题目了就写一点题
5 155 -76 | -8~5
我们先来看第一题因为都是正数所以三码合一都可以是补码5 15 0000 0101 0000 1111 0000 0101 5 第二题 5 -7 1000 0111 -7的原码 1111 1000 -7的反码 1111 1001 -7的补码现在可以开始计算了 0000 0101 0000 0001 1 第三题 6 | -8 1000 1000 -8的原码 1111 0111 -8的反码 1111 1000 -8的补码 0000 0110 | 1111 1110 结果的补码 1111 1101 结果的反码 1000 0010 结果的原码 -2 第四题 ~5 0000 0101 ~ 1111 1010 补码 1111 1001 反码 1000 0110 原码 -6 public class Hello {public static void main(String[] args) {System.out.println(5 15: (5 15));System.out.println(5 -7: (5 -7));System.out.println(6 | -8: (6 | -8));System.out.println(~5: (~5));}
}相信大家都已经会用了可以通过程序计算然后自己也计算去计算一下其他的数然后我举的例子里面少了异或在我写完的时候才想到想想算了大家伙应该已经会了只要跟着规则来都是不会出问题的毕竟计算机是肯定会去计算出一个准确的结果的
但是还有一件事要告诉大家其实位运算还是没有学完因为只是学完了最难的四个其实还有三个分别是 分别是左移、右移和无符号右移
public class Hello {public static void main(String[] args) {System.out.println(50 1);System.out.println(50 1);System.out.println(50 1);System.out.println(-8 1);System.out.println(-8 1);}
}分别是左移(乘2因为底层是除了符号位整体左移1位)右移(除以二整体除符号位右移1位)无符号右移( 整体右移1位这个就要看底层了)自然把1给改成2就是乘4或者是除以4了这个可以自己摸索一下原理不难
复合赋值运算符 最难的部分位运算符已经攻克了所以现在来学习一个简单一点的东西来放松一下吧 顾名思义就是复合赋值比如说i i 1那就是把i1了之后的结果赋值给i这个复合起来写可以不写i就是写成 i 1 就是i i 1加减乘除左右移位运算这些。
三元运算符 这个比较有意思 首先先说一点三元运算符是一个整体然后他的结构我来介绍一下是这样 表达式1 ? 表达式2 : 表达式3
表达式1 是返回布尔值的也就是返回true或者false表达式2是在表达式1返回true的时候才会执行然后返回false的话就会执行表达式3。
public class Hello {public static void main(String[] args) {System.out.println(true ? 5 : 3);System.out.println(false ? 5 : 3);}
}然后他是一个整体也是会进行隐式类型转换的比如 true ? 1 : 2.0,那他的结果会是1.0
圆括号 这个玩意讲都可以不用讲了括号括上优先级直接飙升就这样 也很长了差不多结束了