JAVA数据类型

目录

一、计算机存储单元

二、数据类型

三、为什么byte类型127+1是 (-128)

原码, 反码, 补码的基础概念和计算方法:

1. 原码

2. 反码

3. 补码

总结:反码是为了解决减法运算,补码是为了解决反码产生的+-0的问题

四、浮点数和精度丢失问题

造成精度丢失的原因有:

五、char类型

四、转义字符

五、Boolean类型


一、计算机存储单元

计算机存储设备的最小信息单元叫“位(bit)”,通常用小写字母“b”表示。而计算机中最小的存储单元叫“字节(byte)”,通常用大写字母“B”表示,字节是由连续的8个位组成。

一些常用的存储单位:

1B(字节) = 8 bit(按照二进制来算,一字节可以呈现256中可能,即2^8种

1KB = 1024 B

1MB = 1024 KB

1GB = 1024 MB

1TB = 1024GB 

二、数据类型

JAVA语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以他们表示的数据大小也是不一样的。

数据类型分为基本数据类型和引用数据类型。

1、基本数据类型又分为数值型和非数值型

数值型有整数型(byte、short、int、long);浮点数型(float、double);字符型(char

非数值型为布尔类型(boolean:true或者false

其中数据类型内存占用和取值范围如下图:

代码如下

public class VariableDemo02 {
	public static void main (String[] args) {
		//定义变量一定要给值,不给就不能使用!
		//定义byte类型的变量
		byte b = 10;
		System.out.println(b);
		
		//定义short类型的变量
		short s = 100;
		System.out.println(s);
		
		//定义int类型的变量
		int i = 10000;
		System.out.println(i);
		
		//定义double类型的变量
		double d = 13.14;
		System.out.println(d);
		
		//定义char类型的变量
		char c = 'a';
		System.out.println(c);
		
		//定义boolean类型的变量
		boolean bb = true;
		System.out.println(bb);
		System.out.println("----------");
		
		//定义long类型的变量
		long l = 10000000000L;
		//L 的作用是因为上面默认是int类型的,而10000000000超出了int类型范围,所以在数字后面加一个“L”,转换为long类型!
		System.out.println(l);
		System.out.println("----------");
		
		//定义float类型的变量
		float f = 13.14F;
		//同理:浮点数据类型的默认值是double类型,所以需要在13.14后面加上一个F!
		System.out.println(f);
	}
}

运行结果为:

2、引用数据类型

类(class)、接口(interface)、数组(  [ ]  )

三、为什么byte类型127+1是 (-128)

 *此处原因就涉及到了计算机组成原理中的原码,补码,反码的问题

原码, 反码, 补码的基础概念和计算方法:

原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式.

1. 原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]

即:[-127 , 127]


2. 反码

反码的表示方法是:

正数的反码是其本身

负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反


3. 补码

补码的表示方法是:

正数的补码就是其本身

负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

为何要使用原码, 反码和补码

计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同,但是对于负数:

[-1] = [10000001]原 = [11111110]反 = [11111111]补

因为人脑知道第一位是符号位, 在计算的时候会根据符号位, 选择对真值区域的加减.  但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂。 于是提出了将符号位也参与运算的方法.根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单.

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

用原码表示, 让符号位也参与计算, 对减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数.

问题其实就出现在"0"这个特殊的数值上. 虽然理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0.

所以补码就是用来解决0的符号以及两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

这样0用[0000 0000]表示, 而以前的-0则不存在了.而且可以用[1000 0000]表示-128。

总结:反码是为了解决减法运算,补码是为了解决反码产生的+-0的问题

四、浮点数和精度丢失问题

首先,数值类型之间的合法转换为:

 从图中我们可以看出存储占用字节少的类型向存储占用字节多的类型转化不会丢失精度(实线),而存储占用字节多的类型向存储占用字节少的类型(包括占用字节一样的类型)转换都可能发生精度丢失(虚线),通俗来说类似于用大碗装小碗里的东西可以,可是用小碗装大碗里的东西就不行。

经典面试问题:int和float精度哪个高?

答案:int(int和float虽然都是由32位组成,但是其中float有1位符号位,8位指数,只有23位是数值尾数。也就是说它的精度仅为23位。而整型int也由32位组成,它只有1位是符号位,剩下的31位都是数值尾数。)

造成精度丢失的原因有:

1.直接转换造成的精度丢失:

比如int转换float:int是4个字节32位,其格式为:

它的取值范围:-2^31~(2^31)-1;
虽然float也是4个字节32位,但格式和int不一样。其格式为:

 

 它的取值范围:-3.40282347E+38F~3.40282347E+38F,具体点可以在一个坐标上体现:

 从图中可以看出当float越靠近两端时,可以表示的数值就越稀疏。当稀疏到一定程度时,float将不能表示int类型的值,即将int转换成float类型时,可以会和int类型表示的值存在偏差,就像上图中所示,float中没有该int数值对应的值时,float就会认为这个值的大小是离这个点最近的点所对应的值,就会出现精度丢失。
2.强制转换引起的精度丢失:

用int和float;为什么int可以直接转换成float,而float不能转换成int。这是因为float表示的数值范围要比int表示的多,也就是说float中有些数值是int无法表示的,所以float转换成int得强制转换。float转int精度丢失有两种情况: 
1.int可以表示该float值(和int转float精度丢失情况一样):

 2.int无法表示float值(int会将该值认为是最大或最小值):

五、char类型

java中的char占两个字节,是一个单一的16位Unicode字符。最小值为\u0000(即是0),最大值为\uffff(即为65,535)
char c1='a'; //任意字母
char c2='中'; //任意单个中文字符
char c3=111; //整数0-65535输出字符编码表中对应的字符
char类型是用来存储Unicode编码的字符的,Unicode编码字符集包含 了汉字,所以
char类型变量可以存储单个汉字。不过如果某个特殊汉字没有被包含在Unicode编码字
符集中,那么,char就不能存储这个特殊汉字字符(注: unicode编码占用两个字节)

示例代码:

public static void main(String[] args) {
		char c1 = '中';
		char c2 = '\u4e2d';
        char c3 = 20013
		System.out.println(c1);
		System.out.println(c2);
        System.out.println(c3);
	}

注释:’4e2d‘为’中‘所对应的16位Unicode编码

char类型是多少个字节,是看使用了什么编码,如果使用ascll编码,就是n个字符,n个字节,如果是unicode编码,就是n个字符,2n个字节

四、转义字符

对于不方便输出的字符可以采用转义字符表示:

转义字符含义:

\n 表示回车

\r 表示换行符

\\ 表示反斜杠( \ )

\' 表示单引号( ' )

\" 表示双引号( " )

五、Boolean类型

boolean(布尔)类型有两个值:flase和true,用来判断逻辑条件。

注意:数值型和boolean之间不能直接转化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值