1、变量计算在计算机中的存储原理
都是采用二进制:使用0、1,按照逢2进1的规则表示数据来存储
计算机中表示数据的最小单元:一个字节(byte, 简称B,是使用8个二进制位组成的),字节中的每个二进制位就称为 位(bit,简称b), 1B = 8b。
平时我们接触到的数据不只是数字啊,我们接触到的都是电影,图片、声音、文字啊,这些在计算机里也是用二进制存储的;
声音数据存储范围
图片就是无数个像素点组成的,l每个像素点的数据:用0 ~ 255*255*255表示其颜色;
字符在计算机中是如何存储的?
答:字符存的是ascii码表中对应的数字的二进制形式,lASCII编码表:即美国信息交换标准编码,规定了现代英语、数字字符、和其他西欧字符对应的数字编号。
2、进制的转化
2.1十进制转二进制
十进制数转二进制数:除二取余法
2.2 二进制转十进制
从右往左给二进制的每一位数依次按照1 2 4 8...标记,只需要将为1的位置上的十进制数字加起来,就是二进制对应的十进制
2.3八进制与十六进制
注意:Java程序中支持书写二进制、八进制、十六进制的数据,分别需要以0B或者0b、0、0X或者0x开头
2.4二进制转八进制
2.5二进制转十六进制
package com.ithema;
/**
* 数据书写格式
*/
public class Case01 {
public static void main(String[] args) {
//二进制书写格式
int a = 0B110;
System.out.println("a="+a);//a=6
//八进制书写格式
int b = 0567;
System.out.println("b="+b);//b=375
System.out.println("b = " + b);//b=35
//十六进制书写格式
int c = 0XFA;
System.out.println("c="+c);//c=250
}
}
2.6另一种方法
其实进制的转化不需要去算,只需要记住有这个方法就行,电脑上自带一个计算器
3、计算机的组成单位
计算机表示数据的最小组成单元是:字节,1B = 8b,在B的基础上,计算机发展出了KB、MB、GB、TB、…. 这些数据单位。
4、数据类型的分类
四大类八种
数据类型 | 内存占用(字节数) | 数据范围 | |
整型 | byte | 1 | -128~127 |
short | 2 | -32768~32767 | |
int(默认) | 4 | -2147483648~2147483647 (10位数,大概21亿多) | |
long | 8 | -9223372036854775808 ~ 9223372036854775807 (19位数) | |
浮点型(小数) | float | 4 | 1.401298 E -45 到 3.4028235 E +38 |
double(默认) | 8 | 4.9000000 E -324 到1.797693 E +308 | |
字符型 | char | 2 | 0-65535 |
布尔型 | boolean | 1 | true,false |
5、自动类型转换
类型范围小的变量,可以直接赋值给类型范围大的变量。存在不同类型的变量赋值给其他类型的变量,所以需要自动类型转换。
package com.ithema;
/**
* 自动类型转换
* 类型范围小的变量,可以直接赋值给类型范围大的变量。
*/
public class Case03 {
public static void main(String[] args) {
//将byte类型的数据 直接 赋值给 int类型的变量
byte a = 116;
int b ;
b = a;
System.out.println("b = " + b);//b=156
//将int类型的数据 直接 赋值给 double类型
int c = 1564;
double d;
d = c;
System.out.println("d = " + d);//d=1564.0
//将char类型的数据('a') 直接 赋值给 int类型
char e = 'F';
int f ;
f= e;
System.out.println("f = " + f);//f=70
}
}
6、表达式类型转换
在表达式中,小范围类型的变量,会自动转换成表达式中较大范围的类型,再参与运算
注意:表达式的最终结果类型由表达式中的最高类型决定,在表达式中,byte、short、char 是直接转换成int类型参与运算的。
package com.ithema;
/**
* 表达式类型转换
* 在表达式中,小范围类型的变量,会自动转换成表达式中较大范围变量的类型,再参与运算。
* byte 、short、char---->int---->long---->float---->double
* 表达式的最终结果类型由表达式中的最高类型决定。
* 在表达式中,byte、short、char 是直接转换成int类型参与运算的。
*/
public class Case04 {
public static void main(String[] args) {
// byte short char 类型运算 相加
byte a1 = 125;
char a2 = 'A';
short a3 = 155;
int d = a1+a2+a3+10;
System.out.println("d = " + d);
}
}
7、强制类型转换
类型范围大的数据或者变量,直接赋值给类型范围小的变量,会报错。
强行将类型范围大的变量、数据赋值给类型范围小的变量
int a =20;
bite b=(byte)a;
执行原理
int a = 20;byte b = (byte)a;
System.out.println(b); // 20
int i = 1500;byte j = (byte)i;
System.out.println(j); // -36
注意事项:强制类型转换可能造成数据(丢失)溢出;浮点型强转成整型,直接丢掉小数部分,保留整数部分返回。
8、运算符
8.1基本运算符
符号 | 作用 | 说明 |
+ | 加 | 参考小学一年级 |
- | 减 | 参考小学一年级 |
* | 乘 | 参考小学二年级,与“×”相同 |
/ | 除 | 与“÷”相同,注意:在Java中两个整数相除结果还是整数。 |
% | 取余 | 获取的是两个数据做除法的余数 |
案例:数值拆分,一个三位数,将其拆分为个位、十位、百位后,打印在控制台
package com.ithema;
/**
* 数值拆分
* 需求:一个三位数,将其拆分为个位、十位、百位后,打印在控制台
* 公式总结:
* 个位 :数值 % 10
* 十位 :数值 / 10 % 10
* 百位 :数值 / 100 % 10
* 千位 :数值 / 1000 % 10
*/
public class Case07 {
public static void main(String[] args) {
int a= 10086;
int b= a%10;
int c= a/10%10;
int d= a/100%10;
int e =a/1000%10;
int f= a/10000%10;
System.out.println("b = " + b);
System.out.println("c = " + c);
System.out.println("d = " + d);
System.out.println("e = " + e);
System.out.println("f = " + f);
}
}
8.2自增自减运算符
符号 | 作用 |
自增:++ | 放在某个变量前面或者后面,对变量自身的值加1 |
自减:-- | 放在某个变量前面或者后面,对变量自身的值减1 |
++ 、-- 只能操作变量,不能操作字面量的
++、--如果不是单独使用(如在表达式中、或者同时有其它操作),放在变量前后会存在明显区别;放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1、-1
package com.ithema;
/**
* 自增自减 与 自增自减注意
*
* 自增:++ 放在某个变量前面或者后面,对变量自身的值加1
* 自减:-- 放在某个变量前面或者后面,对变量自身的值减1
* 注意:
* ++ 、-- 只能操作变量,不能操作字面量的。
*
* ++、--如果不是单独使用(如在表达式中、或者同时有其它操作),放在变量前后会存在明显区别
* 放在变量的前面,先对变量进行+1、-1,再拿变量的值进行运算。
* 放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1、-1
*/
public class Case08 {
public static void main(String[] args) {
int n = 10;
int rs = n++;
System.out.println("rs = " + rs);
int a = 10;
int b = 15;
int c = ++a+ --b - b-- +a +++a-b;
System.out.println("c = " + c);
int rs2 = ++n;
System.out.println("rs2 = " + rs2);
}
}
8.3赋值运算符
就是“=”,从右边往左看
符号 | 用法 | 作用 | 底层代码形式 |
+= | a+=b | 加后赋值 | a = (a的类型)(a + b); |
-= | a-=b | 减后赋值 | a = (a的类型)(a - b); |
*= | a*=b | 乘后赋值 | a = (a的类型)(a * b); |
/= | a/=b | 除后赋值 | a = (a的类型)(a / b); |
%= | a%=b | 取余后赋值 | a = (a的类型)(a % b); |
注意:扩展的赋值运算符隐含了强制类型转换
package com.ithema;
/**
* 赋值运算符
*
* 基本的赋值运算符:= (从右边往左看)
* 扩展的赋值运算符:+=、-=、*=、/=、%=
*/
public class Case10 {
public static void main(String[] args) {
//-=的使用
int a1 = 15;
int a2 =6;
a2-=a1;
System.out.println("a2 = " + a2);
//+=是使用
char a3='A';
int a4 = 5;
a3+= (char)a4;
System.out.println("a3 = " + a3);
//*=的使用
int a5=4;
char a6='Z';
a5*=a6;
System.out.println("a5 = " + a5);
///=的适应
int a7 = 84;
char a8 = 's';
a7 /=a8;
System.out.println("a8 = " + a7);
}
}
8.4关系运算符
符号 | 例子 | 作用 | 结果 |
> | a>b | 判断a是否大于b | 成立返回true、不成立返回false |
>= | a>=b | 判断a是否大于或者等于b | 成立返回true、不成立返回false |
< | a<b | 判断a是否小于b | 成立返回true、不成立返回false |
<= | a<=b | 判断a是否小于或者等于b | 成立返回true、不成立返回false |
== | a==b | 判断a是否等于b | 成立返回true、不成立返回false |
!= | a != b | 判断a是否不等于b | 成立返回true、不成立返回false |
判断数据是否满足条件,最终会返回一个判断的结果,这个结果是布尔类型的值:true或者false。
8.5逻辑运算符
符号 | 叫法 | 例子 | 运算逻辑 |
& | 逻辑与 | 2 > 1 & 3 > 2 | 多个条件必须都是true, 结果才是true; 有一个是false,结果就是false |
| | 逻辑或 | 2 > 1 | 3 < 5 | 多个条件中只要有一个是true, 结果就是true; |
! | 逻辑非 | ! (2 > 1) | 就是取反:你真我假,你假我真。!true == false、!false == true |
^ | 逻辑异或 | 2 > 1 ^ 3 > 1 | 前后条件的结果相同,就直接返回false,前后条件的结果不同,才返回true |
符号 | 叫法 | 例子 | 运算逻辑 |
&& | 短路与 | 2 > 10 && 3 > 2 | 判断结果与“&”一样,过程不同:左边为 false,右边则不执行。 |
|| | 短路或 | 2 > 1 | | 3 < 5 | 判断结果与“|”一样,过程不同:左边为 true, 右边则不执行。 |
! && || 运行效率高,用的更多
package com.ithema;
/**
* 逻辑运算符
*
* 把多个条件放在一起运算,最终返回布尔类型的值:true、false。
* & :逻辑与 多个条件必须都是true, 结果才是true; 有一个是false,结果就是false
* | :逻辑或 多个条件中只要有一个是true, 结果就是true;
* ! :逻辑非 就是取反:你真我假,你假我真。!true == false、!false == true
* ^ :逻辑异或 前后条件的结果相同,就直接返回false,前后条件的结果不同,才返回true
*
* && : 短路与 判断结果与“&”一样,过程不同:左边为 false,右边则不执行。
* || : 短路或 判断结果与“|”一样,过程不同:左边为 true, 右边则不执行。
*
* 注意:在java中, “&” 、 “|”: 无论左边是 false还是 true,右边都要执行。
*
*/
public class Case12 {
public static void main(String[] args) {
int a1=2;
int a2=-8;
int a3=45;
int a4=8;
System.out.println("a1<a2&a1>a3 = " + (a1 < a2 & a1 > a3));
System.out.println("a3<a4|a4>a2 = " + (a3 < a4 | a4 > a2));
System.out.println("!(a2>a4) = " + !(a2 > a4));
System.out.println("a1>=a2^a3<=a4 = " + (a1 >= a2 ^ a3 <= a4));
System.out.println("a2>=a3&&a4>=a1 = " + (a2 >= a3 && a4 >= a1));
System.out.println("a2>=a3||a4>=a1 = " + (a2 >= a3 || a4 >= a1));
}
}
8.6三元运算符
条件表达式 ? 值1:值2;
执行流程:首先计算关系表达式的值,如果值为true,返回值1,如果为false,返回值2
package com.ithema;
/**
* 三元运算符
*
* 三元运算符: 条件表达式 ? 值1 : 值2;
* 执行流程:首先计算条件表达式的值,如果值为true,返回值1,如果为false,返回值2。
*
*/
public class Case13 {
public static void main(String[] args) {
//1.需求:分数大于等于60 输出 "考试通过" 反之输出 "成绩不合格"
int a1=86;
System.out.println(a1>=60?"考试通过":"成绩不合格" );
//2.需求:找到3个整数中最大的数 例如:50 40 60
int a = 50;
int b = 40;
int c = 60;
int max = a > b ? a : b;//50
max = max > c ? max : c;
System.out.println("max = " + max);
//3.表达式中,哪个运算符先执行后执行是要看优先级的,例如 “*、/” 的优先级高于”+、-”。
//() > 自增自减 > 算术运算符 > 关系运算符 > 逻辑运算符 > 三元运算符 > 赋值运算符
//System.out.println(10 > 3 || 10 > 3 && 10 < 3);
System.out.println(10 > 3 || 10 > 3 && 10 < 3);
System.out.println(10 > 3 || (10 > 3 && 10 < 3));
}
}
8.7运算符优先级
9案例知识:在程序中接收用户通过键盘输入的数据
package com.ithema;
//1.导包(使用java提供的工具就需要导包)
import java.util.Scanner;
/**
* 键盘录入技术
* <p>
* 请在程序中,提示用户通过键盘输入自己的姓名、年龄,并能在程序中收到这些数据,怎么解决?
*/
public class Case14 {
public static void main(String[] args) {
//1.导包(不用自己敲)
//2.创建键盘录入对象
Scanner sc = new Scanner(System.in);
//3.接收数据(根据实际的情况选择相应的方法来接收数据)
System.out.println("请输入您的姓名:");
String name = sc.next();//sc.next().var enter自动编写好返回值变量类型
System.out.println("请输入您的年龄");
int age = sc.nextInt();
System.out.println("您输入的姓名 = " + name);
System.out.println("您输入的年龄 = " + age);
}
}
加油!