今天的学习内容,老师就给我们上了一份大餐,计算机的 进制 ,当然我们学习肯定不会像百度百科那样的一点点的详细的去了解。毕竟我们学习的是java语言,所以根据java的内容来学二进制的。(内容与标题不太相同见谅啊QAQ,我也不知道该取啥标题)
基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
字节型 | byte | 1个字节 | -128 至 127 |
短整型 | short | 2个字节 | -32768 至 32767 |
整型 | int(默认) | 4个字节 | -2^31^ 至 2^31^-1 |
长整型 | long | 8个字节 | -2^63^ 至 2^63^-1 19位数字 |
单精度浮点数 | float | 4个字节 | 1.4013E-45 至 3.4028E+38 |
双精度浮点数 | double(默认) | 8个字节 | 4.9E-324 至 1.7977E+308 |
字符型 | char | 2个字节 | 0 至 2^16^-1 |
布尔类型 | boolean | 1个字节 |
e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方。
变量在定义(使用代码展示):
public static void main(String[] args) { byte b = (byte) 128; System.out.println(b); char char1 = 'a'; System.out.println(char1); short short1 = 21292; System.out.println(short1); float float1 = 212212.3123213f; System.out.println(float1); long long1 = 1213312l; System.out.println(long1); double double1 = 121.3112; System.out.println(double1); boolean boo = true; System.out.println(boo); int int1 = 1; System.out.println(int1); int int2 = 1, int3 = 2; System.out.println(int2 + "" + int3); int i, j; i = 2; j = 3; System.out.println(i + "" + j); }
声明变量的注意点:
数据类型之间的转换:
类型转换,分为自动转换,强制转换。
自动转换: 根据数据类型的范围来觉定:byte-->short,char-->int-->long-->float-->double-->String
就如byte可以自动转换为int类型,反之int类型不能自动转换为byte类型。
强制转换:
public static void main(String[] args) { /* * 强制转换 案例 * */ int a = 1; char b = (char) a; /* * ==>这里因为a的范围比b的范围要大, 所以编译器不确定变量啊的大小, * 为了避免a的值超过char 范围所以需要进行强转 */ double d = 213.21312; float f = (float) d; /* 同样这里的原理也是一样的 */ double d1 = 21231.121; int i = (int) d1; /* 当然也适用于浮点型转化为整型 */ /* * 不过需要注意的是当自动转换时,变量不会因为 转换而丢失精度, * 例如:int a =2 转换为 double d = a时。d的值会为2.0。 * 强转时,变量会因为强转而丢失精度 * 例如:double d = 3.121322,转换为int a = (int)d; a的值为3,就等于丢失了小数部分 * */ }
插入一个小知识点:Ascll编码 ,下面有一个例子:
public static void main(String[] args) { /* Ascll编码表案例 */ char a = 'a'; int i = 1; System.out.println(a + i); //输出98 /* 我们知道 char类型能自动转换为int类型从输出值为98可以反过来算出 变量a为97, *为什么为97,因为在Ascll表中a的Ascll值为97。 * */ }
关于类型的强转,下面还有一个细节的知识点:
下面的程序有问题吗?
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析: s += 1
逻辑上看作是s = s + 1
计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,s=s+1进行两次运算
,+=
是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1
就是s = (short)(s + 1)
,因此程序没有问题编译通过,运行结果是2。
因此,这里要说一点的是,赋值运算符默认进行了强制类型转换。
/* ======================================================================== */
其实还学了运算符,但对于我的用处不怎么大所以就不撰写了。无非是一些加减乘除,我就直接扣两张图放着。
运算符:
算数运算符:
算数运算符 | 作用 | 例子(a=11,b=2) |
---|---|---|
+ |
加法运算,字符串连接运算 | 13=a+b; |
- |
减法运算 | 9=a-b; |
* |
乘法运算 | 22=a*b; |
/ |
除法运算,取整除结果 | 5=a/b; |
% |
取模运算,两个数字相除取余数 | 1=a%b; |
++ | 自增: 操作数的值增加1 | a++或++a,a的值都为13 |
-- | 自减: 操作数的值减少1 |
赋值运算符:
作用 | 说明 | |
---|---|---|
= |
赋值 | a=10,将10赋值给变量a |
+= |
加后赋值 | a+=b,将a+b的值给a |
-= |
减后赋值 | a-=b,将a-b的值给a |
*= |
乘后赋值 | a*=b,将a×b的值给a |
/= |
除后赋值 | a/=b,将a÷b的商给a |
%= |
取余后赋值 | a%=b,将a÷b的余数给a |
关系运算符:
说明 | |
---|---|
== |
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 |
逻辑运算符:
作用 | 说明 | |
---|---|---|
& | 逻辑与 | a&b,a和b都是true,结果为true,否则为false |
| | 逻辑或 | a|b,a和b都是false,结果为false,否则为true |
^ | 逻辑异或 | a^b,a和b结果不同为true,相同为false |
! | 逻辑非 | !a,结果和a的结果正好相反 |
&& | 短路与 | 1. 两边都是true,结果是true 2. 一边是false,结果是false 短路与特点:符号左边是false,右边不再运算 |
|| | 短路或 | 1. 两边都是false,结果是false 2. 一边是true,结果是true 短路或特点: 符号左边是true,右边不再运算 |
! | 取反 | 1. ! true 结果是false 2. ! false结果是true |
三元运算符:
数据类型 变量名 = 布尔类型表达式?结果1:结果2
格式:int a = 3>4? 12312 :123213;
位运算符:
有个帖子写的还不错:https://cloud.tencent.com/developer/article/1528990
二进制: 由 0和1组成,逢二进一 例如 1的二进制为 0000 0001 ; 2的二进制为 0000 0010;
2进制转换为10进制: 十进制整数转换成二进制采用“除2倒取余”,十进制小数转换成二进制小数采用“乘2取整”。
列如 :6转换为2进制, 6除以2 =3 余0 接着 3除以2 = 1 余 1 即为 110 所以6的二进制为 0000 0110;
二进制转十进制采用按权相加法:https://blog.csdn.net/yuanxiang01/article/details/82503568
位运算:位运算符指的是两个数之间的位运算,运算过程中都转换为字节类型参与运算。比如:数字3转换为字节数为0000 0011。
符号 | 作用 | 说明 |
---|---|---|
& | 按位与 | 两数同位对比,有0则为0 |
| | 按位或 | 两数同位对比,有1则为1 |
^ | 按位异或 | 两数同位对比,不同为1,相同为0 |
~ | 按位取反 | 针对一个数,操作数的每一位都取反 |
<< | 按位左移 | 针对一个数,操作数的每位向左移动指定位数,最高位丢弃,尾部空位补0(相当于乘以2的n次方) |
>> | 按位右移 | 针对一个数,操作数的每位向右移动指定位数,头部空位补符号位数,移除部分丢弃 |
>>> | 无符号右移 |
如下有代码案列:
public static void main(String[] args) { /* * 位运算符案列 */ System.out.println(2 & 3); /* 按位与 * 2的二进制数为 0000 0010 ;2的二进制为0000 0011 两数同位对比有0则0, * 所以值为 0000 0010; 所以输出的值为2。 */ System.out.println(2 | 3); /* 按位或和与恰巧反过来 * 2的二进制数为 0000 0010 ;2的二进制为0000 0011 两数同位对比有1则1, * 所以值为 0000 0011; 所以输出的值为3。 */ System.out.println(2^3); /* 按位异或 * 2的二进制数为 0000 0010 ;2的二进制为0000 0011 两数同位对比不同为1,相同为0, * 所以值为 0000 0001; 所以输出的值为1。 */ System.out.println(~2); /* 按位取反 * 2的二进制数为 0000 0010 ; 操作数的每一位都进行取反, * 所以值为 1111 1101; 所以输出的值为-3。 */ System.out.println(2<<3); /* 按位左移 * 2的二进制数为 0000 0010 相当于把2的二进制每位左移3位,尾部用0补齐 * 所以值为 0001 0000; 所以输出的值为16。 */ System.out.println(-16>>3); /* 按位右移 * 2的二进制数为0001 0000 相当于把2的二进制每位右移3位,头部用0补齐移出部分丢弃 * 所以值为 0000 0010; 所以输出的值为2。 */ System.out.println(15>>>2); /* 无符号右移 * 无符号右移运算符和右移运算符的主要区别在于负数的计算,因为无符号右移是高位补0,移多少位补多少个0。 * 15的二进制位是0000 1111 , 右移2位0000 0011,结果为3。 */ }
同样正在学习的你下面的题怎么回答:
1. 简答题:简述Java数据类型有哪些。
2. 简答题:简述Java变量定义及初始化赋值时要注意的问题。
3. 简答题:简述下面的程序是否有问题,指出问题位置并说明。
1 public static void main(String[] args){
2 byte b1=134;
3 byte b2=21;
4 byte b3=1 + 2;
5 byte b4=b1 + b2;
6 System.out.println(b3);
7 System.out.println(b4);
8 }
4. 编程题:下列程序执行结果为?
public static void main(String[] args){
int x=10;
double y=20.2;
long z=10;
String str=""+x+y*z;
System.out.println("str= " + str);
}
5. 简答题:下面程序执行结果为。
public static void main(String[] args){
int i=1;
int j=i++;
int k=i + ++i * j--;
System.out.println(“i=”+i +“,j=”+j + “,k=”+k);
}
6. 简述题:简述&与&&的区别。
7. 编程题:使用最有效的方式计算3<< 4的结果。
8. 编程题:两个变量 int a = 1; int b = 2;如何将两个变量的值互换。
个人学习,内容简略