1.强制类型转换

强制类型转换,代码需要特殊格式处理,格式:(要转换成的类型)xxx,不能自动完成,
此处区别于自动升级
 		自动升级如
 				byte bt1 = 127;//此处不能填写128  因为已经超出了该类型的取值范围,编译期就会报错
		        byte bt2 = 127;
		        int i = bt1 + bt2;//此处编译器不知道计算之后的值会不会超出该类型的取值范围,
		        所以会直接对该值进行一次扩大

强制类型转换  如果将上述的结果i进行强制类型转换,如(byte)i将得到一个新的数,由于i已经超出
了byte类型的取值范围,因此系统转换的时候会将该数对应的二进制数直接截取后8位后重新计算

如 254 的二进制表示形式为
00000000 00000000 00000000 11111110
截取后8位后变成如下形式11111110

而计算机中首位如果是1,则表示该数为负数,负数还原成十进制的计算方法是,各个位逐个取反
然后加一

11111110→逐个取反后得到→00000001→然后对结果加一,二进制数逢二进一得到→00000010→
然后对该数值转换成十进制数→1*2^1得到结果2→别忘了二进制数原来首位是1表示该数是个负数,
所以要加一个负号在前面,所以最终的结果得到→-2

此处有同学可能会有疑问,为什么强制转换后的数一定在该类型对应的范围内呢?其实这个问题很好理解,因为byte类型的位数是8位,强制类型转换的时候在第一步就将原本是32位的int类型的前24位都丢掉了,所以强制转换后的数一定是在目标类型的范围内的,至于为什么最大值最小值就是特定的值,我们以byte进行举例

byte类型总共占据8个二进制位,所以不难理解byte型表示的最大数值是01111111,大家不要忘了,最前面的
那一位是表示正负的,这个地方一定要切记,一不留神就是天上地下的区别,我给大家推算一下为什么是
127,这个不难理解,直接对最大的二进制数进行计算就可以了,1*2^0 + 1*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 
1*2^5 + 1*2^6 = 1 + 2 + 4 + 8 +16 +32 + 64 = 127 最大值就是他没错,那么最小值呢?嘿嘿嘿 既然首位表示
的已经是正负了,而且负数计算的时候还要先取反再加一,那么绝对值越大的负数自然就越小喽,同学们肯
定想到了,那么 最小的数二进制形式是1000000,这样取后7位得到0000000,然后逐位取反得到1111111,
是不是发现一件很神奇的事,居然和正数的最大值是一样的,惊喜不惊喜?那么闭着眼睛也知道了等于127
呗,然后细节来了,需要加一有木有忘了,大声告诉我等于几?128没错,然后加上符号位得到最终的数
值-128,看到没,byte类型的取值范围出来了,-128~127,转换一下  -2^7 ~ 2^7-1 ,是不是和上一篇的内容
完全一致。

参见JAVA基础笔记

2.算术运算符

符号

释义

+

加法 - 相加运算符两侧的值

-

减法 - 左操作数减去右操作数

*

乘法 - 相乘操作符两侧的值

/

除法 - 左操作数除以右操作数


取余 - 左操作数除以右操作数的余数,也叫做取模

++

自增: 操作数的值增加1

- -

自减: 操作数的值减少1

对于一个整数的除法来说,用的是整除,整数除以整数仍然是整数,结果只有商没有余数,如5/2=2而不是5/2=2.5,而5%2=1取模运算,byte short char 类型在进行算术运算时会优先转换成int类型
加号 + 的三种用法
1.对于数值类型的数进行的时常规四则运算的加法
2.对于字符char类型来说,在进行计算时会被提升为int再进行计算,char类型数字为unicode对应的int类型数字,例如 int i1 = ‘a’ + 1;//计算得到i1的值为98.
3.对于字符串String来说,加号代表字符串的连接操作,如"1220" + “2113” = “12202113”,而不是3333,因为是字符串类型相加,任何数据类型和字符串连接时都会变成字符串。

还有一个有趣的自增自减运算符,这是一个针对变量才有的运算符,常量不可用
1.单独使用:自己独立成为一个步骤,++ 和 – 放在变量前后无影响
2.混合使用:与赋值,打印等等操作时,如果是再变量前使用,则变量的值立即生效,然后再参与后续的运算,如果是在变量后使用,则变量先用原有的值参与运算后然后在生效;