day04_基本数据类型丶变量丶类型转换

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

前置知识

计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。
进制

进制也就是进位计数制,是人为定义的带进位的计数方法 。不同的进制可以按照一定的规则进行转换。
进制的分类

  • 十进制:由0到9 数字组成,进位规则:逢十进一,
  • 二进制:0到1 数字组成,进位规则:逢二进一
  • 八进制:0到7 数字组成,进位规则:逢八进一
  • 十六进制:0到9数字和字母a到f 组成,进位规则:逢十六进一
在Java代码中如何表示四种进制的值
  1. public class Demo1 {
  2.     /*
  3.         十进制:Java中,数值默认都是10进制,不需要加任何修饰。
  4.         二进制:数值前面以0b开头,b大小写都可以。
  5.         八进制:数值前面以0开头。
  6.         十六进制:数值前面以0x开头,x大小写都可以。
  7.         注意: 书写的时候, 虽然加入了进制的标识, 但打印在控制台展示的都是十进制数据.
  8.      */
  9.     public static void main(String[] args) {
  10.         // 十进制:正常表示
  11.         System.out.println(10);//10
  12.         //二进制:0b或0B开头
  13.         System.out.println(0B10);//2
  14.         
  15.         //十六进制:0x或0X开头
  16.         System.out.println(0x10);//16
  17.         //八进制:0开头
  18.         System.out.println(010);//8
  19.     }
  20. }
复制代码
计算机如何存储运算数据

计算机中的数据,都是以二进制补码的形式在存储和运算,而补码则是通过反码和原码推算出来的。

  • 原码 :可直观看出数据大小,就是二进制定点表示法,即最高位为符号位,【0】表示正,【1】表示负,其余位表示数值的大小。
  • 反码 : 正数的反码与其原码相同,负数的反码是对其原码逐位取反,但符号位除外。
  • 补码 : 数据以该状态进行运算,正数的补码与其原码相同;负数的补码是在其反码的末位加1。

Java中如何存储字符

在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。编码表 :就是将人类的文字和一个十进制数进行对应起来组成一张表格。例如:
​​

总结:

  • 将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII(Amercan Standard Code for Information Interchange 美国标准信息交换码)。
  • Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
  • Java中使用的字符集:Unicode字符集。存储字符时:需要查找码表,找到字符对应的数字,将数字转换为二进制数存放到计算机中 。使用字符时:将对应的二进制数转换为十进制 找到ASC表中对应的字符 显示出来
  • 如果编码和解码的使用不是同一种编码表,则会出现乱码问题。
例如:
  1. public class Demo {
  2.     public static void main(String[] args) {
  3.         //字符类型变量
  4.         char c = 'a';
  5.         int i = 1;
  6.         //字符类型和int类型计算
  7.         System.out.println(c + i);//98
  8.     }
  9. }
复制代码
​数据类型

前置知识:

  • 进制计算机中的数据不同于人们生活中的数据,人们生活采用十进制数,而计算机中全部采用二进制数表示,它只包含0、1两个数,逢二进一,1+1=10。每一个0或者每一个1,叫做一个bit(比特)。
  • 字节是我们常见的计算机中最小存储单元。计算机存储任何的数据,都是以字节的形式存储,右键点击文件属性,我们可以查看文件的字节大小。 8个bit(二进制位) 0000-0000表示为1个字节,写成1 byte或者1 B,计算机数据计量单位 如下所示


数据类型分类
Java是一种强类型语言,针对每种数据都给出了明确的数据类型 。Java的数据类型分为两大类:

  • 基本数据类型:包括 整数、浮点数、字符、布尔类型
  • 引用数据类型:包括 类、数组、接口。​
​今天我们重点学习的是基本数据类型,关于引用数据类型,后面我们会重点学习。
那为什么会有不同的数据类型呢?

  • 不同的数据类型分配了不同的内存空间
  • 不同的内存空间,所存储的数据大小是不一样的
在这里,我们给出每种基本数据类型的内存占用和取值范围,大家了解一下:
注意事项:

  • 书写long类型的常量,需要在数字后面加大写L(建议用大写)或小写l
  • 如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型
  • 书写char类型的字符常量,我们可以直接写单个字符或者写转义字符又或者直接写Unicode编码值的十六进制形式。因为在Java中是使用Unicode编码表表示。(兼容ASCII码),每一个字符都有一个唯一的Unicode编码值。
  • 虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true
  • 浮点类型不精确,因为十进制的小数部分转二进制会需要舍去。float类型的4个字节能表示的数字范围比long类型的8个字节还要大因为小数底层存储方式与 整数不同
变量

字面量就是数据/数值,只有“字面量”机制的话,是远远不够的,因为只有字面量内存是无法重复利用的。使用变量之后,内存空间就得到了复用。所谓变量:可变化的量。它的意思是变量中存储的数据不是一成不变的,是可以被改变的, 假设变量 i 中之前存储的数据是 10,我们可以将 10 换成 100,变量就是这个意思。声明变量的实质就是申请内存空间。变量的作用用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。根据变量名进行使用,可以输出,也可以修改值。变量定义的格式包括三个要素:

  • 数据类型:规定了变量可以存储数据大小及存储什么样子的数据
  • 变量名:告诉程序员如何访问这块内存及其里面的数据
  • 数据值:存储在变量中的数据
变量的声明和赋值


  • 方式一:先声明,后赋值(使用前赋值即可)
  1. public class Demo01Variable {
  2.     public static void main(String[] args) {
  3.         /*
  4.             变量的定义格式
  5.                 数据类型 变量名称;
  6.                 变量名称 = 数据值;
  7.         */
  8.         byte a;//声明了一个byte类型(1个字节)的变量,给变量名称叫做a
  9.         //把数字66存储到byte类型的变量a中
  10.         a = 66;
  11.         //打印变量a中保存的数据
  12.         System.out.println(a);// 66
  13.         //把数字88存储到byte类型的变量a中,原有的数据66将被替换
  14.         a = 88;
  15.         //打印变量a中保存的数据
  16.         System.out.println(a);// 88
  17.         
  18.     }
  19. }
复制代码
还可以在同一行声明多个同一种数据类型的变量,中间使用逗号隔开。但不建议使用这种方式,降低程序的可读性。
  1. public class Demo02Variable {
  2.     public static void main(String[] args) {
  3.         /*
  4.             变量的定义格式
  5.                 数据类型 变量名称1,变量名称2,变量名称3;
  6.                 变量名称1 = 数据值1;
  7.                 变量名称2 = 数据值2;
  8.                 变量名称3 = 数据值3;
  9.           */
  10.         //声明了三个int类型(4个字节)的变量,给每个变量分别起名为c,d,e
  11.         int c, d, e;
  12.         //给c,d,e 变量分别赋值
  13.         c = 200;
  14.         d = 300;
  15.         e = 500;
  16.         //打印各种变量中保存的数据
  17.         System.out.println(c);//200
  18.         System.out.println(d);//300
  19.         System.out.println(e);//500
  20.     }
  21. }
复制代码

  • 方式二:声明变量且同时赋值
  1. public class Demo03Variable {
  2.     public static void main(String[] args) {
  3.         /*
  4.             变量的定义格式二:
  5.                 数据类型 变量名称 = 数据值;
  6.         */
  7.         //声明了一个short类型(2个字节)的变量,变量名称为b,同时给b赋值为100
  8.         short b = 100;
  9.         
  10.         System.out.println(b);// 100
  11.     }
  12. }
复制代码
也可以在同一行声明多个同一种数据类型的变量,中间使用逗号隔开。但不建议使用这种方式,降低程序的可读性。
  1. public class Demo04Variable {
  2.     public static void main(String[] args) {
  3.         /*
  4.         变量的定义格式
  5.                 数据类型 变量名称1 = 数据值1,变量名称2 = 数据值2,变量名称3 =数据值3 ;
  6.         */
  7.         //声明3个long类型的变量f,g,h,并且同时各自赋值
  8.         long f = 600L,g = 700L,h = 800L;
  9.         //打印long类型(8个字节)的变量中保存的内容
  10.         System.out.println(f);  //600
  11.         System.out.println(g);  //700
  12.         System.out.println(h);  //800
  13.     }
  14. }
复制代码
变量定义的注意事项:

  • 变量名称:在同一个大括号范围内,变量的名字不可以相同。对变量重写赋值时  前面一定不要加数据类型,否则 相当于 重新声明一个新的变量会报错
  • 变量的作用域:变量的有效范围。大家可以记住一句话,变量出了所在的大括号就从内存中释放了。如果超过作用域,也会报“找不到符号”错误 。例如:局部变量只在方法体当中有效,方法体执行结束该变量的内存就释放了。
  • 变量赋值:定义的变量,不赋值不能使用。赋值又叫初始化,如果没有初始化,会报“未初始化”错误
  • 定义long类型的变量时:需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围。
  • 定义float类型的变量时:需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是 double, double的取值范围是大于float的,类型不兼容。
代码示例
  1. public class Demo04Variable {
  2.     public static void main(String[] args) {
  3.         /*
  4.         1. 变量名不允许重复定义
  5.         */
  6.         int a = 10;
  7.         // int a = 20;  错误代码,重复定义变量名
  8.         a = 20;
  9.         System.out.println(a);
  10.         /*
  11.         3. 变量在使用之前一定要进行赋值
  12.         */
  13.         int i;
  14.         //System.out.println(i);错误
  15.         /*
  16.         4. 定义float和long变量的注意事项
  17.                 定义float类型变量的使用: 需要在数值的后面加入F的标识,F可以大写也可以小写.但是, 建议大写
  18.                 定义long类型变量的使用 : 需要在数值的后面加入L的标识,L可以大写也可以小写.但是, 建议大写
  19.         */
  20.         float f = 12.3F;
  21.         long l = 1000L;
  22.         System.out.println(f);
  23.         System.out.println(l);
  24.         /*
  25.         5. 变量的作用域范围
  26.                 变量的作用域 : 只在它所在的大括号中有效
  27.         */
  28.         {
  29.             int x = 20;
  30.             // 当这个大括号中的代码执行完毕后, 内部所[定义]的变量就会丛内存中消失
  31.             System.out.println(x);
  32.         }
  33.         //System.out.println(x); 错误:变量的作用域 : 只在它所在的大括号中有效
  34.     }
  35. }
复制代码
数据类型转换

Java程序中要求参与的运算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。boolean类型不参与数据类型转换。
自动类型转换


  • 将 取值范围小的类型 自动提升为 取值范围大的类型的过程就是自动类型转换。自动类型转换是自动完成的,不需要我们代码的干预。自动类型转换对原有数据大小是没有影响的,数据类型的转换关系(取值范围从小到大),如图所示:

下列情况就会发生自动类型转换

  • 当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时,
  1. int i = 'A';//char自动升级为int
  2. double d = 10;//int自动升级为double
  3. byte b = 127; //右边的整数常量值必须在-128~127范围内
  4. //byte bigB = 130;错误,右边的整数常量值超过byte范围
  5. long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换
  6. long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过
复制代码

  • 当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算
  1. int i = 1;
  2. byte b = 1;
  3. double d = 1.0;
  4. double sum = i + b + d;//混合运算,升级为double
复制代码

  • 当byte,short,char数据类型进行算术运算时,按照int类型处理
  1. byte b1 = 1;
  2. byte b2 = 2;
  3. byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为int
  4. char c1 = '0';
  5. char c2 = 'A';
  6. System.out.println(c1 + c2);//113
复制代码
强制类型转换


  • 将取值范围大的类型 强制转换成 取值范围小的类型 的过程就是强制类型转换
特点:

  • 自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
  • 转换格式:数据类型 变量名 = (数据类型)被转数据值;
  • 强制类型转换对原有数据大小是有影响的,有可能造成数据溢出和精度损失
下列情况就会发生强制类型转换
当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
  1. public class Demo02Convert {
  2.     public static void main(String[] args) {
  3.         short s = 1;
  4.         /*
  5.             s是short类型,1是int类型,运算时类型不一致,会发生自动类型转换
  6.             short类型(2个字节)的s会自动转换成int类型
  7.             最终变成了两个int数据相加,结果是int类型
  8.             不能直接赋值给左侧的short类型的变量s
  9.             但是在赋值之前把int类型的结果,强制转换成short类型(砍掉左侧的2个字节的内容),
  10.         */
  11.         s = (short) (s + 1);
  12.         System.out.println(s);
  13.         double d = 9.999;
  14.         int i = (int) d;//精度损失
  15.         System.out.println(i);//9
  16.         int a = 8888;
  17.         byte b = (byte) a;//数据溢出
  18.         System.out.println(b);//-72
  19.     }
  20. }
复制代码
当某个值想要提升数据类型时,也可以使用强制类型转换。提示:这个情况的强制类型转换是没有风险的。
  1. int i = 1;
  2. int j = 2;
  3. double shang = (double)i/j;
复制代码
基本数据类型之间是存在固定的转换规则的,无论是哪个程序, 将这 6 个规则套用进去,问题迎刃而解:


  • 八种基本数据类型中,除 boolean 类型不能转换,剩下七种类型之间都可以进行转换;
  • 如果整数型字面量没有超出 byte,short,char 的取值范围,可以直接将其赋值给 byte,short,char 类型的变量;
  • 小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short(char) < int < long < float < double,其中 short 和 char 都占用两个字节,但是 char 可以表示更大 的正整数;
  • 大容量转换成小容量,称为强制类型转换,编写时必须添加“强制类型转换符”,但运行时可能出现精度损失,谨慎使用;
  • byte,short,char 类型混合运算时,先各自转换成 int 类型再做运算;
  • 多种数据类型混合运算,各自先转换成容量最大的那一种再做运算;
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表