(2)数据类型和运算符

1.java数据类型有基本数据类型和引用数据类型。基本数据类型有8种:数值型(整型、实型)、字符型、布尔型。引用数据类型有数组、类和接口。
整数类型:byte(1个字节-128~127),short(2个字节-32768~32767),int(4个字节),long(8个字节)
实数类型:float(4个字节),double(8个字节)
字符类型:char(2个字节)
布尔类型:java并没有明确规范boolean类型所占字节,jvm规范指出程序编译后的boolean类型用int存储
2.取模运算的一个特殊性:5%(-2)=1 ;(-5)%2=-1;取模运算中结果的符号看被模数,如果被模数为+,结果就为+,被模数为-,结果就为-;而除法运算除数和被除数有一个负数,结果就为负数。除法运算的正负性遵循一般规律。
% |被模数|<|模数|,结果是被模数;
  |被模数|=|模数|,结果是0;
  |模数|=1,结果是0;
3. 转义字符:
\n:换行
\r:按下回车键 Enter
\t:制表符 Tab 
\b:退格键 Backspace

换行与回车的区别:dos下,换行用\n;
                  windows下回车符用两个字符表示,即\r\n;
                  Linux下,换行用一个字符表示,\n;
4.观察程序:
   byte b=3;
   b=b+4;
上述程序编译会出错,因为整型常量4默认是int型,与b相加提升精度,结果是int型,赋值给byte型b时会丢失精度。但是下面程序是正确的:
   byte b=3;
   b+=4;
表达式b+=4结果等同b=b+4,但运行机制不同,前者是两次运算,高精度赋值给低精度时精度丢失,后者相当于一次运算,把左右两者之和赋值给左边,内部会进行自动类型转换。
提问?既然整数默认是int型常量,byte b=3为什么不会丢失精度,这也是一次性赋值运算,也是内部自动类型转换,系统会判断3是否在byte的区间内,如果在则自动转换类型,如果不在,例如 byte b=128;则编译报错:可能丢失精度。继续下面例子:
   byte b=3;
   b+=126;
这时虽然第二行结果129已经超出byte范围,但这时问题与byte=129不同,已经不属于由于类型转换导致精度丢失的问题了,这是数据溢出,结果是-127
所以,纯粹的赋值运算可以自动进行类型转换而程序正常编译运行。(=  +=  -=  %=  /=   ;b=b+4算混合运算)

除法运算同样要考虑精度转换问题:
  int a=5;
  int b=2;
  a=a/2;   //   int/int,结果是double,如果赋值给a会发生精度损失,所以舍弃小数点后的内容,结果是2
所以,算数运算符可以丢失精度而程序正常编译运行。
5.移位问题
左移<<,左移几位就表示乘以2的几次幂,在末尾补零;
右移>>,右移几位表示除以2的几次幂,如果最高位是1,就在前面补1,如果最高位是0,就在前面  补0;
无符号右移>>>,不论最高位是1还是0,都在前面补0。
6.位运算
&与(&&短路与)     |或(||短路或)      ~取反        ^异或

与:都为1时才为1(可以把1看成真,0看成假)
或:都为0时才为0
取反:1变0,0变1
异或:两者不同为1,相同为0。小应用:7^4^4=7 ,一个数异或另一个数两次还得到它本身,可以应用于加密算法。

&和&&,|和||的区别
       &&是短路与,当左边已经是假的情况下,就不会判断右边的真假,直接返回假。例如,(4>7)&&(5/0==0)vs (4>7)&(5/0==0),前者返回假,后者报错,除数不能为0;
       ||是短路或,当左边已经是真的情况下,就不会判断右边的真假,直接返回真;例如,(7>4)||(5/0==0) vs (7>4)|(5/0==0),前者返回真,后者报错,除数不能为0.
7.最有效的方式计算2*8?
运用移位运算2<<3(左移3位)
8.交换m n的值
方案一
    int m=3,n=4;
    int  temp=m;
    m=n;
    n=temp;
不用第三个变量交换m,n的值?
方案二
    m=m+n;  (m+n的值可能超出int的范围,所以该方法有局限性)
    n=m-n;
    m=m-n;
方案三
    m=m^n;     m=3^4
    n=m^n;      n=(3^4)^4 ……3
    m=m^n;     m=(3^4)^3……4   m=m^(m^n) 或者 m=(m^n)^m  这个n已经被赋上m的值了
9.计算机中数值都是以补码形式存储的。正数的原码、反码、补码都一样
10.十进制转换为十六进制的一种算法:
先把十进制转换为二进制,然后通过&15运算过滤,取得二进制最后四位,计算保存,然后把原来的二进制无符号右移4位(>>>4),再次通过&15运算过滤就得到倒数第二个四位,依次计算。
其实就是
while(num>=15)
{
    num=num%15;
    保存num;
    num=num/16;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值