进制运算&数据类型&变量&运算符

1.原码反码补码

(1)0正1负

(2)正数的原码反码补码都相同

(3)负数的反码是对其原码逐位取反,符号位除外;负数补码是反码加一。

PS:二进制中,1+1相加,等于0进1

2.数据类型

定义的格式:变量名 = 变量值;

数据类型分类(要背)

(1)整数型  (整数默认的数据类型int)

byte 占一个字节  -128到127

注:byte为什么在-128到127之间,首先byte为一个字节占八位,最大二进制01111111,换算成二进制数为127,最小二进制1000000(补码),求出原码,换算成十进制就是-128

short 占两个字节  -2^15到2^15-1

int 占四个字节  -2^31到2^31-1

long 占八个字节 -2^63到2^63-1


注意点:

①long定义

其中long类型的定义比较特殊

例:long x = 89738568L;   (在数字末尾要加上L)

②byte在运算过程中,会遇到超出取值范围的情况

例:byte b = (byte)(126 + 4);

       System.out.println(b);     //输出-126

这个括号部分属于强制类型转化,式子已经超出了byte  的取值范围,但是强行定义b为byte类型,因此超出部分将从负数开始计算。

在把一个值赋值给另一个值的时候,小的数据类型可以直接赋值给大的数据类型(隐式转换)

(2)浮点型  (小数默认的数据类型是double)

float 占四个字节 -3,403E38到3,403E38 单精度

double  占八个字节 -1,798E308到1,798E308  双精度

float定义末尾要加f

例:float x = 3.222f

(3)字符型

char 占两个字节 0到65535

例:char a = ‘b’;  //输出b

       char b = 97;   //输出a,对应的是ASCII码表,取值范围是0到65535

PS:char可以存储中文,但是只能存储一个汉字

如:char = ’你‘;

(4)布尔型

boolean 理论上是占八分之一个字节,因为一个开关就可以决定true和false了,   但是Java中没有明确规定它的大小

3.变量相加和常量相加的区别(要背)

byte a1 = 3;

byte a2 = 4;

byte a3 = a1 + a2;

System.out.println(a3);

上面的程序在运行的时候会出现报错,会损失精度。

原因:(1) byte与byte(或short或char)运算会提升为int,。

          (2)a1和a2是两个变量,变量存储的值是变化的,在编译的时候无法判断里面具体的值,相加有可能会超出byte的取值范围。

例:byte a4 = 3 + 4;  //不会报错

上面显示的常量相加, Java编译器有常量优化机制。

4.数据类型之间的转化

在运算过程中,小的运算范围会自动提升为大的

 byte,short,char——int——long——float——double

 PS:float要比long要大

5.字符和字符串参与运算(易错点)

例1:

System.out,println(‘a’+ 1 );

得到98,因为有ASCII码表,刚刚上面说了,char类型会自动变为int类型,

a代表97,因此此处输出为98。

System.out.println( (char ) (’a’+ 1));

得到b,因为用了强制转化类型。

例2:

System.out.println(“hello” + ‘a’ + 1);

得到helloa1,任何数据类型用+与字符串相连接都会产生新的字符串

System.out.println(‘a’+ 1 + “hello”);

得到98hello,因为字符串在后面,先计算前面的值,而前面的值为98。

乱入的知识点:

整数相除,结果只能得到整数,要得到小数,必须把数据强制变为浮点类型。

System.out.println( 10 / 4 );   //输出2
System.out.println( 10 / 4.0 ); //输出2.5,把其中一个改成小数,就可以得到小数,另一个自动提升。

PS:整数和小数进行运算时,是double类型,不是int类型。

6.运算符

 (1)取余 %

当左边的绝对值小于右边的数时,结果为左边。

System.out.println( 2 % 5 );    //得到2

System.out.println( -2 % 5);   //得到-2

System.out.println( -12 % 5);  //得到-2

当左边的绝对值等于右边的数或者倍数时,结果为0。

System.out.println( -5 % 5);   //得到0

当左边的绝对值大于右边的绝对值大于右边,结果为余数。

System.out.println( -13 / 10); //得到-3

PS:得到值得正负,是由左边的正负决定的,与右边的正负无关

任何正整数 % 2,不是1就是0,可以用来当做切换条件 

(2)++- -

不管是a++还是++a,a的值都会+1

例1:

a = 3;

b = a++; // 此时a = 4,b = 3,原因是a碰到了a++,因此a的值+1,b还是原来的数。原因是++在后面,先赋值再自身+1.

b = ++a ; //此时a = 4,  b = 4, 原因是a此时遇到了++a,因此a的值+1。当++在前面的时候,先进行自身+1再进行赋值。

例2:int x = 4;

int y = (x++)+(++x)+ (x*10)

                 4             6             60

最后的值为70

(要背)

byte b = 10

b++;  //不会报错,因为b++是一个运算符,在运算的时候,会自动加强制转转化符,b = (byte)(b + 1)

b = b + 1; //会报错,损失精度。因为10,1都是int类型,运算结果自动变为int型,byte和int混合运算时,会自动提升为int,所以byte会损失精读。

(要背)

程序:short s = 1; s = s +1;

System.out.println(s);

// 报错原因,short与int类型进行运算,自动变为int类型,损失精度。

short s = 1; s += 1;

// 不会报错,因为+=是一个运算符,相当于加了一个强制转换符,

   b = (byte)(b + 1)

(3)关系运算符

只会出现true 和 false

一个=为赋值,==为比较

直接上例子

System.out.println( 4 == 3);  //false

System.out.println( 4 != 3);  //true

System.out.println( 4 > 3);  //true

System.out.println( 4 >= 3);  //true

(4)逻辑运算符

1>    & 逻辑与(并且), 有false则false

int a = 3;

int b = 4;

int c = 5;

System.out.println(a < b & b < c);          //true & true = true

System.out.println(a < b & b > c);          //true & false = false

System.out.println(a > b & b < c);          //false & true = false

System.out.println(a > b & b > c);          //false & false = false

&与&&的区别:

二者最终结果是一样的,但是&&具有短路效果,左边是false,右边不执行。

2>  | 逻辑或  ,有true 则true

int a = 3;

int b = 4;

int c = 5;

System.out.println(a < b | b < c);          //true | true = true

System.out.println(a < b | b > c);          //true | false = true

System.out.println(a > b | b < c);          //false | true = true

System.out.println(a > b | b > c);          //false | false = false

 

单 | 与双 || 的区别:两者最终结果是一样的,当时 || 具有短路效果,左边是true,右边不执行。 2.

3>  ^ 逻辑异或,两边相同为false

int a = 3;

int b = 4;

int c = 5;

System.out.println(a < b ^ b < c);          //true ^ true = false

System.out.println(a < b ^ b > c);          //true ^ false = true

System.out.println(a > b ^ b < c);          //false ^ true = true

System.out.println(a > b ^ b > c);          //false ^ false = false

 

4>  !逻辑非,

System.out.println(!true);

System.out.println(!!true);

 

第一个为false,第二个true

(5)位运算符(了解)

①  位与 &

System.out.println( 6 & 3 ); //  0110 & 0011,遇0则0,0010,输出2

②  位或 |

System.out.println( 6 | 3 );  // 0110 | 0011, 遇1则1,0111,输出7

③  位异或 ^

System.out.println( 6 ^ 3 ); // 0110 ^ 0011, 两边相同则为0,0101,输出5

PS:一个数据被同一个数据异或两次结果等于本身。

④  取反~

System.out.println(~6); //输出-7

6是int类型,四个字节,有32位。运算都是补码运算

00000000 00000000 00000000 00000110   6的原码反5补码都是本身

11111111 11111111 11111111 11111001   按位取反的结果,这是补码

11111111 11111111 11111111 11111001

 -   00000000 00000000 00000000 00000001

11111111 11111111 11111111 11111000     这是反码

10000000 00000000 00000000 00000111     这是原码,代表-7

⑤左移 << (左边最高位丢弃,右边补齐0)

System.out.println(12 << 1); //输出24

System.out.println(12 << 2); //输出48

向左移动几位,就是乘以2的几次幂

⑥右移 >>

System.out.println(12 << 1); //输出6

System.out.println(12 << 2); //输出3

向右移动几位,就是除以2的几次幂

(6)三元运算符

(关系表达式)? 表达式1 : 表达式2;

int x = 10;

int y = 5;

int z;

z = (x > y) ? x : y;

输出10

例1:判断两个整数是否相同

int x = 5;

int y = 10;

boolean b = ( x == y ) ? true : false;

或者直接写 boolean b = ( x == y ); //因为==本身就是比较

例2:判断三个数中的最大值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值