Java学习5:数据类型(下)与运算符

数据类型(下)

char x = 97;这个java语句是允许的,并且输出的结果是'a'.
由此可知,
当一个整数赋值给char类型变量的时候,会自动转换成char字符型,最终的结果是一个字符。
当一个整数没有超出char的趣致范围的时候,这个整数可以直接赋值给char类型的变量。

二进制原码、反码、补码

计算机在任何情况下都稚嫩识别二进制。
计算机在底层存储数据的时候,一律存储的是“二进制补码形式”
计算机采用二进制补码形式存储数据的原因是:补码形式效率最高。
对于一个正整数来说,二进制原码、反码、补码是同一个,完全相同。
int i = 1;
对应的二进制原码:00000000 00000000 00000000 00000001
对应的二进制反码:00000000 00000000 00000000 00000001
对应的二进制补码:00000000 00000000 00000000 00000001
对于一个负数来说
byte i = -1;
对应的二进制原码:10000001
对应的二进制反码(符号位不变,其它位取反):11111110
对应的二进制补码(反码+1):11111111
分析:byte b = (byte) 150;这个b输出多少?
int类型的4个字节的150的二进制码是:00000000 00000000 00000000 10010110
强转为1个字节的byte类型,最终在计算机中的二进制码是:10010110
注存储意:计算机永远存储的都是二进制的补码形式。
也就是说10010110,这是一个二进制补码形式,可以用逆推导的方式推算出这个二进制补码对应的原码是什么。
10010110--->二进制补码形式
10010101--->二进制反码形式
11101010--->二进制原码形式
11101010化成十进制就是 -(64+32+8+2)= -106
所以,输出结果应该是-106

byte short char 混合运算

public class Int{
  public static void main(String[] args){
    char c1 = 'a';
    byte b = 1;
    //注意:这里的“+”是负责求和的。
    System.out.println(c1 + b);//输出的是98
  }
}

结论:byte、short、char做混合运算的时候,各自先转换成int再做运算。
short k = 98;这是没有任何问题的。但是,short s = c1 + b;是不能通过编译的。编译器不知道这个加法运算最后的结果是多少,只知道是int类型。如果想要改正,可以用short s = (short)(c1 + b);

多种数据类型的混合运算

多种数据类型做混合运算的时候,最终的结果类型是“最大容量”对应的类型。
char+short+byte混合运算的时候除外,会各自先转换成int类型在做运算。

int类型和int类型最终的结果还是int类型。

java中规定,int类型和int类型最终的结果还是int类型。
在java中计算结果不一定是精确的。

int temp1 = 10/3;//这里“/”是除号,运行结果最终取整
System.out.printfln(temp1);//输出结果是3
int temp2 1/2;
System.out.printfln(temp2);//输出结果是0

浮点型数据

浮点型包括:float(4个字节)、double(8个字节)
float是单精度,double是双精度,double更精确。
但是需要注意的是,如果用在银行方面或者说使用在财务方面,double也是远远不够的。在java中提供了一种精度更高的类习惯,这种类型专门使用在财务软件方面:java.math.BigDecimal(属于引用数据类型)
float和double存储数据的时候都是存储的近似值。
因为现实世界中有这种无限循环的数据,数据实际上是无限循环的,但是计算机内存有限,用一个有限的资源表示无限的数据,只能存储近似值。
注意:任意一个浮点型都比整数型空间大。float容量>long容量。
java中规定,任何一个浮点型数据默认被当作double来处理。如果想让这个浮点型字面量被当作float类型来处理,那么请在字面量后面添加F或f。
float f = 3.14;这个是不能编译通过的,要想编译通过,可以float f = 3.14f;,也可以float f = 3.14F;,也可以float f = (float)3.14;

布尔型数据

在java语言中boolean类型只有两个值,没有其他值:true和false。
不像c或者c++,c语言中1和0也可以表示布尔类型。
boolean类型在实际开发中,使用在逻辑判断当中,通常放到条件位置上(充当条件)

基本数据类型转换规则

第一条:八种基本数据类型中,出boolan类型不能转换,剩下的其中类型之间都可以进行转换。
第二条:如果整数型字面量没有超出byte,short,char的取值范围,可以直接将其赋值给byte,short,char类型的变量。
第三条:小容量向大容量转换成为自动类型转换,容量从小到大的排序为:
byte < short(char) < int < long < float < double,其中short和char都占用两个租户额,但是char可以表示更大的正整数。
第四条:大容量转换成小容量,成为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用。
第五条:byte,short,char类型混合运算时,先各自转换成 int 类型再做运算。
第六条:多种数据类型混合运算,各自先转换成容量最大的那一种再做运算。
所有得笔试题都超不过以上的规则。
练习

public class Test{
  public static void main(String[] args){
    //编译报错,类型不兼容,int转byte可能会丢失
    byte b1 = 1000;
    //可以
    byte b2 = 20
    //可以;
    short s = 1000;
    //可以
    int c = 1000;
    //可以
    long d = c;
    //编译错误,类型不兼容,long转int可能会丢失
    int e = d;
    //可以
    int f = 10 / 3;
    //可以
    long g = 10;
    //编译错误,类型不兼容,long转int可能会丢失
    int h = g / 3;
    //可以
    long m = g/3;
    //编译错误,类型不兼容,int转byte可能会丢失
    byte x = (byte)g / 3;
    //可以
    short y = (short)(g/3);
    //可以
    short i = 10;
    //可以
    byte j = 5;
    //编译报错,short和byte做运算最终结果是int类型,int类型转short,可能会丢失
    short k = i + j;
    //可以
    int n = i + j;
    //可以
    char cc = 'a';
    System.out.println("cc = " + cc);//输出cc = 'a'
    System.out.println((byte)cc);//输出97
    //可以
    int o = cc + 100;
    System.out println(o);//输出197
  }
}

运算符

拿不准运算符优先级 就加个括号。

运算符概述

运算符.png

算数运算符

  • 求和
  • 相减
  • 乘积
    / 商
    % 求余数(求模)
    ++ 自加1
    -- 自减1
public class SuanShu{
  public static void main(String[] args){
    int a = 10;
    int b = 3;
    System.out.println(a + b);//加运算,输出的是13
    System.out.println(a - b);//减运算,输出的是7
    System.out.println(a * b);//乘运算,输出的是30
    System.out.println(a / b);//除运算,输出的是3
    System.out.println(a % b);//取余数运算,输出的是1
  }
}

对于++运算符来说,可以出现在变量前,也可以出现在变量后。不管出现在变量前还是变量后,总之++执行结束之后一定会自加1。

int i = 10;
i++;
 System.out.println(i);//输出11
int k = 10;
++k;
 System.out.println(k);//输出11

当++出现在变量后,会先做赋值运算,再自加1。
当++出现在变量前,会先进行自加1运算,然后在赋值。

//++出现在变量后
int m = 10;
int n = m++;
System.out.println(n);//输出10
System.out.println(m);//输出11
//++出现在变量前
int x = 100;
int y = ++x;
System.out.println(y);//输出101
System.out.println(x);//输出101

练习

int c = 90;
System.out.println(c++);//这里有一个隐形的赋值运算。//输出90
//将上一行代码拆开
//int temp1 = c++;
//System.out.println(temp1);
System.out.println(c);//输出91
int d = 80;
System.out.println(++d);//输出81
//将上一行代码拆开
//int temp2 = ++d;
//System.out.println(temp2);
System.out.println(d);//输出81

-- 运算符也是同样的道理。

关系运算符

=
<
<=
==
!=
一定要记住一个规则:所有的关系运算符的运行结果都是布尔类型,不是true就是false,不可能是其它值。
在Java语言中:
= :赋值运算符
== :关系运算符,判断是否相等。
注意:关系运算符中如果有两个符号的话,两个符号之间不能有空格。

public class GuanXi{
  public static void main(String[] args){
    int a = 10;
    int b = 3;
    System.out.println(a > b);//输出的是true
    System.out.println(a >=b);//输出的是true
    System.out.println(a < b);//输出的是false
    System.out.println(a <= b);//输出的是false
    System.out.println(a == b);//输出的是false
    System.out.println(a != b);//输出的是true
  }
}

逻辑运算符

& 逻辑与 理解成 并且
| 逻辑或 理解成 或者
! 逻辑非 理解成 不是 (取反)
&& 短路与
|| 短路或
注意:逻辑运算符两边要求都是布尔类型,并且最终的运算结果也是布尔类型。
对于逻辑与运算符来说,只要有一边是flase,结果就是false。只有两边同时为true,结果才为true。
对于逻辑或运算符来说,只要有一边是true,结果就是true。
对于逻辑非运算符来说,感叹号后面是flase,那就是true,感叹号后面是true,那就是flase。取反。
“短路与 &&” 和“逻辑与 &” 的运算结果没有任何区别,完全相同。只不过“短路与&&”会发生短路现象。
接下来需要理解以下什么是短路现象,什么时候会发生“短路”。
使用短路与的时候,当左边表达式为false的时候,右边的表达式不执行。这种现象叫短路。
从效率方面来说,短路与比逻辑与的效率更高一些。

int x = 10;
int y = 11;
//逻辑与,在两边结果都是true的情况下,结果才是true。
//左边的 x>y 表达式结果已经是false了,其实整个表达式的结果已经确定是false了,按道理来说,右边的表达式不应该执行。
System.out.println( x > y & x > y++);
//通过测试,x > y++ 这个表达式执行了。
System.out.println( y);//输出结果为12
//测试短路与
int m = 10;
int n  = 11;
//使用短路与的时候,当左边表达式为false的时候,右边的表达式不执行。
//这种现象叫短路。
System.out.println( m > n && m > n++);
System.out.println(n);//输出结果为11
//

对于短路或运算符来说,当左边的表达式结果为true的时候,右边的表达式不需要执行,此时会短路。

赋值运算符

赋值运算符包括“基本运算符”和“扩展赋值运算符”
基本赋值运算符:=
扩展赋值运算符:
+=
-=
*=
/=
%=
注意:扩展赋值运算符在编写的时候,两个符号之间不能有空格。
赋值运算符的特点是,右边的表达式先执行,将执行完的这个结果通过等号赋值给左边的变量。
以 += 运算符作为代表,学习扩展赋值运算符。其他的扩展赋值运算符,原理相似。

int k = 10;
k += 20;//k变量追加20         k +=20 类似于  k = k + 20
System.out.println(k);//输出结果为30

i += 10 和 i = i + 10 不完全一样,只能说相似,其实本质上并不是完全相同。

byte x = 100;
System.out.println(x);
//错误:不兼容的类型,从int转换到byte可能会有损失。
//x = x + 1;//编译器检测到x + 1是int类型,int类型不可以直接赋值给byte类型的变量x。
//使用扩展赋值运算符可以。
x += 1;//x在定义的时候就是byte类型,那么x变量的类型永远都是byte。不会变,不管后面是多大的数字。
//其实x += 1 等同于:x = (byte)(x + 1)

结论:x += 1 和 x = x + 1不一样。
很重要的语法机制:使用扩展赋值运算符的时候,永远都不会改变运算结果类型。

条件运算符(三目运算符)

语法格式:布尔表达式 ? 表达式1 : 表达式2
执行原理:布尔表达式的结果为true时,表达式1的执行结果作为整个表达式的结果。布尔表达式的结果为false时,表达式2的执行结果作为整个表达式的结果。
定义变量的时候类型不能随意编写。
如果最终的计算结果是字符型,变量需要使用char类型定义。
表达式1和表达式2的数据类型一定是一样的。编译器会检查数据类型。

字符串连接运算符“+”

  • 运算符在java语言中有两个作用。
    作用1:求和
    作用2:字符串拼接
    当 + 运算符两边都是数字类型的时候,求和。
    当 + 运算符两边的任意一边是字符串类型,那么这个 + 会进行字符串拼接操作。
    一定要记住:字符串拼接完之后的结果还是一个字符串。
    注意:当一个表达式当中有多个加号的时候,遵循自左向右的顺序依次执行。除非额外添加了小括号,小括号的优先级高。
    口诀:加一对双引号,双引号之间加两个加号,两个加号之间放上变量名

练习题

第一题:判断以下程序的输出结果

int x = 10;
int a = x + x++;                       //++在变量后,先赋值再自加1
System.out.println("a = " + a);//10+10=20 输出结果为a = 20
System.out.println("x = " + x);//x++已经执行 输出结果为x = 11 
int b = x + ++x;                       //++在变量前,先自加1再赋值
System.out.println("b = " + b);//11+12=23 输出结果为b = 23
System.out.println("x = " + x);//++x已经执行 输出结果为x = 12
int c = x + x--;                         //--在变量后,先赋值再自减1
System.out.println("c = " + c);//12+12=24 输出结果为c = 24
System.out.println("x = " + x);//x--已经执行 输出结果为x = 11
int d = x + --x;                         //--在变量前,先自减1再赋值
System.out.println("d = " + d);//11+10=21 输出结果为d = 21
System.out.println("x = " + x);//--x已经执行 输出结果为x = 10

第二题:判断以下程序的输出结果

int a = 15;
int b = 2;
double c = 2;
System.out.println(a + "/" + b + "=" +(a/b));输出结果为15/2=7
System.out.println(a + "%" + b + "=" +(a%b));输出结果是15%2=1 
System.out.println(a + "/" + c + "=" +(a/c));输出结果是15/2=7.5
System.out.println(a + "%" + b + "=" +(a%c));输出结果是15%2=1.0

第三题:判断以下程序的输出结果

boolean x,y,z;
int a = 15;
int b = 2;
x = a > b;//true
y = a < b;//false
z = a != b;//true
System.out.println("x =" + x);输出结果为x =true
System.out.println("y =" + y);输出结果为x =false
System.out.println("z =" + z);输出结果为x =true

第四题:判断以下程序的输出结果

int x;
double y;
x = (int)22.5 + (int)34.7;
y = (double)x;
System.out.println("x =" + x);输出结果为x = 56
System.out.println("y =" + y);输出结果为y = 56.0

第五题:判断以下程序的输出结果

int i = 5;
int j = 5;
int m = 5;
int n = 5;
i++;                   //这行代码执行结束之后 i = 6
j = j + 1;            //这行代码执行结束之后 j = 6 
m--;                   //这行代码执行结束之后 m = 4
n = n - 1;           //这行代码执行结束之后 n = 4
System.out.println(i);//输出结果为6
System.out.println(i++);//++出现在变量后面,先赋值再自加1 输出结果为6(这行代码结束之后 i 就是7了)
System.out.println(++i);//++出现再变量前 先自加1再赋值 输出结果为8
System.out.println(i--);//--出现在变量后 先赋值再自减1 输出结果为8(这行代码结束之后 i 就是7了)
System.out.println();//换行
System.out.println(j);//输出结果为6
System.out.println(j++);//++出现在变量后面,先赋值再自加1 输出结果为6(这行代码结束之后 j 就是7了)
System.out.println(j--);//--出现在变量后面,先赋值再自减1 输出结果为7(这行代码结束之后 j 就是6了)
System.out.println(--j);//--出现在变量前面,先自减1再赋值 输出结果为5
System.out.println();//换行
System.out.println(m);//输出结果为4
System.out.println(n);//输出结果为4

第六题:判断以下程序的输出结果

int i = 0;
int j = 0;
System.out.println(i);//输出结果为0
System.out.println(j);//输出结果为0
i++;//  i = 1
++j;//  j = 1
System.out.println(i);//输出结果为1
System.out.println(j);//输出结果为1
System.out.println("----------------");//分隔线
System.out.println(i++);//++出现在变量之后 先赋值再自加1 输出结果为1 此行代码执行完成 i 为2
System.out.println(++j);//++出现在变量之前 先自加1再赋值 输出结果为2 
System.out.println("----------------");//分隔线
System.out.println(i);输出结果为2
System.out.println(j);输出结果为2
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352