一、补码、原码、反码
补码、原码、反码是计算机二进制的三种表现形式,在计算机底层是采用计算机补码的形式表示的,在一个二进制中最高位为符号位,最高位为0则表示正数,最高位为1则表示负数。
对于正数来说它的原码反码补码是相同的。
对于一个负数来说原码是将绝对值转换为二进制,最高位改为1,反码等于原码的符号位不变,其他位取反,补码等于该数的反码+1。
比如 求-2的反码以及补码
首先-2的原码为10000010 反码: 11111101 补码:11111110
这里二进制都用八位表示是因为计算机的基本存储单位是字节(byte),而一个字节有可以存储8个比特位(bit),bit是计算机的最小存储单位,一个位可以存储一个二进制位。
二、Java的数据类型
在Java语言中 变量定要先声明再使用 在声明变量时如果没有对变量进行赋值 系统会自动给予默认值,相对于基本数据类型来说 默认值为0,而相对于引用数据类型来说 默认值为null。
1.整型数据类型
对于整数型字面量来说在Java语言中有四种表示形式,分别为十进制、二进制、八进制以及十六进制表示法。
例如: int a = 10;(十进制表示) int b = 0b101(二进制以0b开头,注意是零不是o)
int c = 012(八进制表示法,以零开头) int d = 0x1f(十六进制以0x开头,由0-9和A-F组成,大小写均可)。
Java中任何一个整数型字面量都会默认被当成int类型来处理。并且Java有自动类型转换(也就是从小容量自动赋值给大容量)
比如:
int a = 100;//首先系统默认100为int类型给他分配四个字节 而int类型也占用四个字节
不存在自动类型转换
而double b = 100; double类型占用8个字节 而系统默认给100分配的是四个字节,但是
100能够存到double类型的b里面 说明小容量可以自动赋值给大容量,也就是存在自动类型
转换.
还有一个转换叫做强制类型转换,也就是将大容量转换为小容量
比如:double x = 1000L;
int a = x;
强制类型转换: int a = (int)x;
上面将double类型的变量x想要存储到int类型的a变量中,首先double内存占用八个字节,1000L也占用八个字节(这里的L可以让系统给数据分配八个字节的内存空间),而int 类型占用四个字节,这时候我们就要看1000这个数据到底占了多少内存1000的二进制也就是1111101000一共11位,也就是连两个字节都占不满,将double类型的x存储到int类型的a中是完全没有问题的,而当我们数字更大,所占用的内存超过四个字节的时候如果我们进行强制类型转换,就会导致数据精度丢失,比如一个数00000000 10000000 00000000 00000000这个数占用了四个字节的内存空间,而我们强制类型让它转换为byte类型(一个字节的内存空间)时,系统就会舍弃前三个字节(00000000 10000000 00000000),只留下00000000,再将00000000作为补码求出其原码我们会发现数据精度损失的非常严重。
注意:当两个数据类型进行运算时会先各自转换为容量最大的类型进行运算。
比如:int a = 10;
byte b = 3;
System.out.print(a/b);
结果想象中是3.333333333333的循环,但实际结果为3
byte和short做混合运算时会先各自转换为int类型的数据进行运算。
1.short a = 10; 2.short a = 10 / 3;
short b = 3;
short c = a / b;
按理来说1和2这两个代码片段没有区别都是可以运行的,但是在运行1片段的时候系统会报错,而运行2片段则不会,因为在short a,和short b之后a和b就会变成变量,这时候就要遵循上面说的两个byte变量进行运算时会先转换为int类型的数据在进行计算,而 short c是以short类型来接受这个int类型的结果的 所以当然不可以,纠错方法为int c = a / b;或者强制类型转换short c = (short)(a / b);
对于2代码片段只有一行short a = 10 / 3;这里的10和3都是字面量,这个结果在编译阶段直接计算为3,然后直接将3赋值为a;
2.浮点型数据类型
浮点型数据类型包括:1.float(4个字节)(单精度数据类型)2.double(8个字节)(双精度数据类型),其中double是常用的,浮点型字面量都默认为double类型,想当作float数据类型来处理的话需要在字面量后面添加F/f,比如3.1415926(double) 3.1415926F(float);
浮点型数据的两种表示方式1.十进制2.科学计数法
例如:bouble x = 3.56;(十进制)
double x = 0.356E2(科学计数法)也就是0.356*10^2;
一个浮点数类型的数据在计算机中存储的不一定是该数值,可能是该数值的近似值,因为计算机内存有限并且数据在计算机中是以进制的形式进行存储的,比如10/3的结果,圆周率等等等等。所以一旦有浮点数类型的数据参与运算,慎用==运算符来进行比较。
3.字符型数据类型
char类型,占用2个字节,取值范围为0-65535
在Java中char类型的字面量必须采用 ‘’ 括起来 比如char a = '1';这里的1只是一个字面量,不是int类型的1;
int c = 'b';和 char a = 'b';
这两个变量c和a的输出结果一样吗? 输出c结果为字符b的ASCll码,输出a结果就是单纯的字符b,这一点是需要注意的;
4.布尔数据类型
Boolean类型就是用来判断的,有true和false两个数值,通常用于if、while、for循环等等语句中。