数据计算的引入

数据类型
1、java中基本数据类型之间存在自动类型转换
当遇到byte,short,char这三种数据类型的变量参与运算的时候,会首先将数据类型提升为int类型,再参与运算
byte,short,char -> int -> long -> float -> double
2、强制类型转换
目标数据类型 变量名 = (目标数据类型)(要转的表达式)
注意:强制类型转换,一般不推荐使用,因为可能会造成精度损失
` public static void main(String[] args) {
//有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
//不能直接将130赋值给byte类型的变量b,130大于byte类型可接受的最大范围
byte b = (byte)130;
System.out.println(b);

    byte b2 = (byte)300; //44
    System.out.println(b2);
}

}

/*
130的原码,反码,补码:00000000 00000000 00000000 10000010
强制类型转换之后:10000010
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
----------------------
数值位转10进制:64+32+16+8+4+2 = 126
最高位是1,最终答案是-126

关系运算符:
> >= < <= != ==

注意:关系表达式最终结果一定是boolean类型

++
单独使用的时候,无论++放在变量的前面或者后面,变量值都是自加1
组合使用的时候,++放在后面,先进行赋值运算,再进行自加1;++放在前面,先进行自加1,然后再进行赋值运算。

    单独使用的时候,无论--放在变量的前面或者后面,变量值都是自减1
    组合使用的时候,--放在后面,先进行赋值运算,再进行自减1;--放在前面,先进行自减1,然后再进行赋值运算。

三目运算符:(关系表达式)?表达式1:表达式2;

运行流程:
    1、先计算关系表达式的结果,无论关系表达式的式子多么复杂,结果一定是boolean类型的
    2、当关系表达式的结果为true的时候,执行表达式1
    3、当关系表达式的结果为false的时候,执行表达式2

注意:
1、表达式1或者表达式2,只会选择其中一个执行
2、三目运算符,整体是要有一个结果的,表达式1或者表达式2都不能是一个没有结果的表达式

位运算符:针对二进制的值补码形式进行计算的
& | ^ ~ << >> >>>
` public static void main(String[] args) {
byte a1 = 3;
byte b1 = 4;

    System.out.println(a1 & b1);
   System.out.println(a1 | b1);
   System.out.println(a1 ^ b1);
    System.out.println(~ b1);
}

}`
数学计算过程: 计算机中所有数据的运算都是采用补码的形式进行的
3的补码:00000011
4的补码:00000100

&运算 有0则0
     00000011
   &
     00000100
  --------------
     00000000  => 0

|运算  有1则1
     00000011
   |
     00000100
  --------------
     00000111  => 7

^运算  相同则0,不同则1
     00000011
   ^
     00000100
  --------------
     00000111  => 7

~运算  1变成0,0变成1
      ~ 00000100
      --------------

补码 11111011
反码 11111010
原码 10000101

=> -5

<< : 左移,右边用0补齐,相当于乘上2的n次方
>>: 右移,左边空出来的,看最高位是1还是0,若是1就用1补齐,若是0就用0补齐,相当于除上2的n次方
>>>: 无符号右移,左边空出来的,无论最高位是0还是1,都用0补齐

`public static void main(String[] args) {
byte b1 = 5;
System.out.println(b1<<2); // 20 = 54 = 52^2
System.out.println(b1<<3); // 5*2^3 = 40
System.out.println(b1<<5);

    System.out.println(24>>2); // 6=24/4=24/2^2
    System.out.println(-24>>2); // 6=-24/4=-24/2^2

    System.out.println(-24>>>2); //


}`

b1的补码:00000101

<<2位:
         00000101
     (00)00010100 -> 20
        -----------

24的补码:00011000
24>>2位:
    00011000
    00000110(00)
    ----------- -> 6

 -24的原码:10011000
 -24的反码:11100111
 -24的补码:11101000
 -24>>2:
           11101000
 补码:     11111010(00)
 ------------------------
 已知补码求原码:
 补码:  11111010
 反码:  11111001
 原码:  10000110
 ---------------- -> -6

 -24的原码:10000000 00000000 0000000 00011000
 -24的反码:11111111 11111111 1111111 11100111
 -24的补码:11111111 11111111 1111111 11101000
 -24>>>2:
        11111111 11111111 1111111 11101000
        0011111111 11111111 1111111 111010(00)
        --------------------------------------- -> 1073741818

posted @ 2024-08-09 22:03  独角戏小南街  阅读(1)  评论(0编辑  收藏  举报