目录
  1. 1. 数据类型的运算
    1. 1.1. 默认转换
      1. 1.1.1. 思考
    2. 1.2. 强制转换
      1. 1.2.1. 格式
      2. 1.2.2. 思考
    3. 1.3. 字符与字符串运算
      1. 1.3.1. 思考
数据类型的运算与转换

数据类型的运算

class demo{
public static void main(String[] args){
int x = 3;
int y = 4;
int z = x + y;
System.out.print(z); // 7
}
}

那么:

class demo1{
public static void main(String[] args){
byte a = 3;
int b = 4;
byte c = a + b;
int d = a + b;
System.out.print(c); // 可能损失精度
System.out.print(d); // 7
}
}

默认转换

一般来说,我们在运算的时候,要求参与运算的数据类型必须一致。

而对于不同的数据类型之间的运算,会有一种默认的转换

默认转换(从小到大的转换):

  • byte,short,char—int—long—float—double
  • byte,short,char相互之间不转换,他们参与运算首先转换为int类型
  • boolean类型不能转换为其他的数据类型

思考

byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?
class demo2 {
public static void main(String[] args) {
//定义了三个byte类型的变量,b1,b2,b3
//b1的值是3,b2的值是4,b没有值
byte b1 = 3,b2 = 4,b;

//b = b1 + b2; // 这个是类型提升,所有有问题

b = 3 + 4; // 常量,先把结果计算出来,然后看是否在byte的范围内,如果在就不报错。
}
}

因此出错的是b=b1+b2;

  • 因为变量相加,会首先看类型问题,最终把结果赋值的也会考虑类型问题。
  • 常量相加,首先做加法,然后看结果是否在赋值的数据类型范围内,如果不是,才报错。

强制转换

从大的数据类型到小的数据类型。

格式

目标数据类型 变量 = (目标数据类型) (被转换的数据);

class demo2 {
public static void main(String[] args) {
byte a = 3;
int b = 4;

//这个是有问题的
//byte c = a + b;
//用强制类型转换改进
byte c = (byte) (a + b);
System.out.println(c); // 7
}
}

注意:
不要随意的去使用强制转换,因为它隐含了精度损失问题。

思考

看看下面两个定义有没有区别呢?

class demo3 {
public static void main(String[] args) {
//看看下面两个定义有没有区别呢?
float f1 = (float)12.345;
float f2 = 12.345F;
}
}
  • f1其实是通过一个double类型转换过来的。
  • 而f2本身就是一个float类型。

byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?

/*
byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
*/
class demo4 {
public static void main(String[] args) {
//因为byte的范围是:-128到127。
//而130不在此范围内,所以会报错。
//byte b = 130;

//我们可以使用强制类型转换
byte b = (byte) 130;

// 结果是多少呢?
System.out.println(b); // -126
}
}

为何会是这样一个结果?请看分析:


分析过程:
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。(值是以源码进行显示的)
而要得到补码,首先要计算出数据的二进制。

A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010

反码: 1 0000001

原码: 1 1111110 -> -126

字符与字符串运算

class demo5 {
public static void main(String[] args) {
//直接输出一个字符
System.out.println('a'); //a
//输出一个字符和一个整数做加法
System.out.println('a'+1); // 97 + 1 = 98
}
}

通过字符和一个整数相加,会按照字符编码,ASCII码进行计算

我们给出一张表:ASCII码表

ASCII码 键盘 ASCII 码 键盘 ASCII 码 键盘 ASCII 码 键盘
27 ESC 32 SPACE 33 ! 34
35 # 36 $ 37 % 38 &
39 40 ( 41 ) 42 *
43 + 44 45 - 46 .
47 / 48 0 49 1 50 2
51 3 52 4 53 5 54 6
55 7 56 8 57 9 58 :
59 ; 60 < 61 = 62 >
63 ? 64 @ 65 A 66 B
67 C 68 D 69 E 70 F
71 G 72 H 73 I 74 J
75 K 76 L 77 M 78 N
79 O 80 P 81 Q 82 R
83 S 84 T 85 U 86 V
87 W 88 X 89 Y 90 Z
91 [ 92 \ 93 ] 94 ^
95 _ 96 ` 97 a 98 b
99 c 100 d 101 e 102 f
103 g 104 h 105 i 106 j
107 k 108 l 109 m 110 n
111 o 112 p 113 q 114 r
115 s 116 t 117 u 118 v
119 w 120 x 121 y 122 z
123 { 124 \ 125 } 126 ~
通过看完这张表以后,我们要记住三个值:
    'a'        97
    'A'        65
    '0'        48

思考


class demo6 {
public static void main(String[] args) {
System.out.println("hello"+'a'+1); // helloa1
System.out.println('a'+1+"hello"); // 98hello

System.out.println("5+5="+5+5); // 5+5=55
System.out.println(5+5+"=5+5"); // 10=5+5
}
}
字符串数据和其他数据做+,结果是字符串类型。
这里的+不是加法运算,而是字符串连接符。
文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-08/07/%E5%AD%A6%E4%B9%A0/%E5%90%8E%E7%AB%AF%E5%AD%A6%E4%B9%A0/JAVA/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E7%9A%84%E8%BF%90%E7%AE%97%E4%B8%8E%E8%BD%AC%E6%8D%A2/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论