java学习笔记
java中的数据类型
可分为两大类:基本数据类型、引用数据类型
基本数据类型:byte、short、int、long、float、double、char、Boolean
引用数据类型:数组、类、接口…
ps:计算机最小的单位是byte(字节),一个字节是八个二进制位。
计算机中只存在0和1(也就是计算机只认识二进制,别问为什么,哈哈),一位可以表示0或者1。
既然一个字节=八位,一位只能以0或1的形式表示,那么我们这一个字节就可以表示28=256中可能性,也就是可以存256个数字,那么按照什么规则来存呢,按二进制的规则来存(逢二进一),故一个字节也就是八位最大的表数是11111111,但什么定义最小的数咋办呢,00000000就是最小的了?老一辈一想这不行啊,得表示负数,那么就认为规定了及首位(第一位)是用来判别正负的,0表示正数,1表示负数。
那就这么一想岂不是最大为01111111,最小为11111111,有些资料可能说+0和-0然后开始讲补码balabala…可我觉得0和-0这也没啥,哈哈。
问题在哪,按之前的逻辑,-1对应的编码10000001,+1对应的编码00000001,这两哥们一加,居然是10000010,居然不是0,这可出问题了,也就是说不能简单地定义个1表示负0表示正了。
咋办呢,好办,我们用0减一个二进制数得到这个数的相反数看看,0-2(00000010)=11111110,也就是说2(00000010)的相反数是-2(11111110),0-2=-2这是个小学数学的问题,那10000000的相反数呢,用0减发现还是10000000,在这个8位的空间里表示10000000没有对应的正(负)数了,咋整呢,巧了00000000也没有对应的。
我们就人为规定了10000000是-128,那这就好办了,256个数字就可以排好了,-128~127之间(包含0),所有的数字都有对应的编码了。(这鸟东西就叫补码:为了保证两个二进制之和为0)
但为什么补码是按位取反再加一呢?(不想研究的直接记-128=10000000,然后直接0-得到相反数)
这里介绍下原码和反码的概念:
原码:就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
0-一个数的补码=其相反数的补码
(11111111+00000001)- 一个数的补码=其相反数的补码
(11111111-一个数的补码)+00000001 = 其相反数的补码
11111111- 一个数的补码=这个数的反码
即 反码+00000001=补码
ps的有点多了,哈哈实际用处不大,纯粹为了探讨下~
##byte-1字节、short-2字节、int-4字节、long-8字节、char-2字节、Boolean-1位
数据类型转换
Tips:分为隐式(自动)类型和强制类型转化
隐式(自动)类型:一般出现在小的数据类型赋值给大的数据类型
byte a = 2;
int i = a; //隐式类型转换
double d = 100; //隐式数据转换,将int转成double,(java中整数默认值为int型)
byte b1 = 10;
byte b2 = 20;
byte b3 = b1 + b2;//错误: 不兼容的类型: 从int转换到byte可能会有损失
byte bb = 10+20; //结果是30,相当于byte = 30,编译器根本看不到10+20;
byte b4 = b1 + 5;
System.out.println(b4);//错误: 不兼容的类型: 从int转换到byte可能会有损失
强制类型转化:
/*强制数据类型转换:要求是大的给小的数据类型赋值
如果必须使用强制类型转换,那么就需要满足转换的格式:
小的数据类型 变量名 = (小的数据类型)大的数据;
注意:强制类型转换容易损失数据(精度),使用需谨慎。*/
int a = (int)4.2;
//发生强转,double-->>int 丢弃小数位(丢失精度、不是四舍五入的规则)