这篇文章,我们来讲一下数据类型
目录
1.由来
写程序与做数学题类似,在数学题中有这样的语句“设X属于R”,它表明X是R类型的数,而不是复数,而Java作为一种强类型语言,它就需要对每个变量进行类型声明,由此引出数据类型。java中的数据类型有两种:基本数据类型、引用数据类型,这篇文章,我们主要讲一下基本数据类型。
2.概述
为了可以表示所有的数据,Java规定了8种基本数据类型,分别为:byte , short , int , long (四种整型)可以用来定义整数类型的数据;float , double(两种浮点型)可以用来定义小数类型的数据;char(字符型)可以用来定义字符类型的数据;boolean(bool型,只有true与false两种取值情况)可以用来定义布尔类型的数据。
3.整型
整型用来表示没有小数部分的数值,它可以是负数,Java提供了4种整型,详细信息见下表:
类型 | 比特数 | 存储需求(字节数) | 范围 |
byte | 8 | 1 | -128 ~ 127 |
short | 16 | 2 | -32768 ~ 32767 |
int | 32 | 4 | -2^31 ~ 2^31-1(正好超过20亿) |
long | 64 | 8 | -2^63 ~ 2^63 |
注意:如果要定义long类型的变量,在数据值的后面需要加一个L作为后缀(包装类Long的数值后面必须加,不然报错),这里可以写l,也可以写L,但是因为l与1容易混淆,所以这里强制要求写L
补充:计算机存储信息的最小单位称之为位,又称为比特,记为bit,1bit数就是1个二进制数,如:10101B 就是5比特数;
存储器中,所包含存储单元的数量称为存储容量,存储容量的基本单位是字节(Byte,简记为B),8个比特(二进制数)记为一个字节,除字节外,还有 KB , MB , GB , TB,它们之间的转换关系如下表
1KB | = | 2^10B = 1024B |
1MB | = | 2^10KB = 1024KB |
1GB | = | 2^10MB = 1024MB |
1TB | = | 2^10GB = 1024GB |
存储实质:
例如:有如下语句:
byte x = 34 ;
在存储时,内存开辟1字节的存储空间,存下34的二进制数:10010 ,并将其补全至8位,即存储 0 010 0010 ,其中最高位为符号位,0代表它为正,1代表它为负。若语句改为:
byte x = -34 ;
计算机会先求它的原码:即1010 0010,再求它的反码:即1101 1101 ,最后存储它的补码:即1101 1110 ,(关于进制转换,原码,反码,补码的问题可以去看我的另一篇文章)。若语句改为:byte x = 256 ; 则超出范围,计算机在编译时会报错。
牢记:正数存原码,负数存补码,正数原码等于补码。
4.浮点型
问:小数如何用二进制数表示?
答:例如:0.125 = 2^(-5),即用x^(-y)可以表示小数
浮点型用于表示有小数部分的数值,它可以是负数,Java提供了两种浮点型,详细信息见下表
类型 | 比特数 | 存储需求(字节数) | 范围 |
float | 32 | 4 | 大约 3.402 823 47E+38F(有效位数6 ~ 7位) |
double | 64 | 8 | 大约 1.797 693 134 862 315 70E+308(有效位数15位) |
注意:
- float 有效位数6 ~ 7位数值越大,损失越多,越不精确
- 如果要定义float类型的变量,在数据值的后面需要加一个F作为后缀(包装类Float的数值后面必须加,不然报错)
问:float 与 int 同占4B,二者范围为何相差那么大?
答:看下方存储实质
存储实质:
注意:float无法表示所有小数,因为精度特别高的就无法用x,y组合表示了
问:为何用float定义某些数据时,输出的与原数据值不同
答:见下方
假设:float类型的值 即( 2^(x-127) )*y 只能表示下面的这些数(结合表达式的特点)
-15000 -5000 -500 -10 0 10 500 5000 15000
现在有语句:float a = 80 ;而80无法用float表达式表示,于是在其表达式所能表示的数据中选出最接近80的数据赋予a,即 a = 10
(上述均为假设,只为说明其原理,数值的举例不可当真)
对比 int 与 float 的精度问题
int 在数轴上是等距排列的,而 float 根据其表达式( 2^(x-127) )*y ,可知在0附近排列密集,数越大排列越稀疏,所以 float 在0附近精度高(比int 高),离0越远精度越低
double(双精度浮点型)存储实质:
5.字符型
表示字符的变量可以用 char 定义,赋初值时要用 ' ' (注意与String的区别)引起字符,例如:
char a = 'a';
字符型变量所占的内存由编码决定,一般有 8比特,16比特,32比特 三种,关于编码,可以看我的另外一篇文章
6.bool型
类型 | 比特数 | 所需内存(字节数) | 范围 |
boolean | 32 | 4 | true 或 false |
问:bool类型变量的取值只有0与1两种,1比特就够了,为什么要用4个字节来存储?
答:见下方
计算机的最小存储单元就是1个字节,即使存1比特数据存储数也需要消耗一个字节(其实由于操作系统,实际需要4KB空间),计算机中数据由内存往cpu传递时需要经过高速缓存,高速缓存是有分块的,每块64个字节大小,每块中可以存放许多份数据,而数据的传输是靠高低电压,数据小,份额多,那么传输次数就增多,堵塞的概率就变大,数据大 ,份额少,传输次数少,堵塞概率小,为了降低堵塞概率,那么数据份额就多,则每份所占的内存就大,所以bool类型占4个字节。
7.标识符
标识符:就是给类,方法,变量等起的名字
意思就是凡是我们自己给起的名字都叫标识符
这个详细的可以看我“java开发手册”专栏中的内容,那里面的内容都是摘自《阿里巴巴开发手册》,在这里就简单的说一下。
硬性要求:
- 所有的名字都是由:数字,字母,下划线(_)和美元符($)组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
软性建议:
小驼峰命名法:适用于方法、变量的命名
规范:
- 标识符为一个单词时,全部小写
- 标识符由多个单词组成时,首个单词的首字母小写,后面单词的首字母大写
大驼峰命名法:适用于类名
规范:
- 标识符为一个单词时,首字母大写
- 标识符由多个单词组成时,每个单词的首字母都大写
最后的要求:不管怎么命名,都要求见名知意
8.键盘录入
键盘录入:就是在键盘输入数值,然后程序中的变量存储数值。
步骤:
- 导包,导入Scanner这个类
- 创建对象,创建Scanner这个类的对象
- 接收数据,使用Scanner这个类的方法
下面看一下具体演示:
代码如下:
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//变量i记录了键盘输入的内容
int i = scanner.nextInt();
System.out.println(i);
}
}
初学者可能看不懂,没关系,后面会讲,这里先记住就行。
9.小结
这篇文章我们讲了java中的基本数据类型,标识符和简单的键盘录入。重点是java的基本数据类型,下面看这张如来总结一下:
上述内容,如有不当,敬请指出!