一、基本数据类型
Java语言提供了八种基本类型。六种数值类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
java中基本数据类型中没有无符号类型(C、C++中有),只有有符号类型。
在计算机内,定点数有3种表示法:原码、反码和补码
原码 :二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码 :正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码 :正数的补码与其原码相同;负数的补码是将其原码的除符号位外的所有位,逐位取反,然后加1。
计算机中数据的运算都是通过补码进行的。
反码是为了解决减法运算,补码是为了解决反码产生的±0的问题。
计算机中负数是用补码的形式保存、并用它参与加减法运算的,减法会被转换为加法,计算机中没有减法运算。
在计算机中减法运算可以转换成加法运算,比如8-1 --> 8+(-1) = 7
- 原码:
8: 0000 1000
-1: 1000 0001
- 反码:
8: 0000 1000
-1: 1111 1110
- 补码:
8: 0000 1000
-1: 1111 1111
- 补码运算:
(0000 1000) + (11111111) = 0000 0111 --> 4+2+1=7
比如:-128+127 --> 127+(-128) = -1
0111 1111 + (1000 0000) = 1111 1111(补码) --> 1111 1110(反码) --> 1000 0001(原码) --> -1
计算机都是以补码来存储的:
⑴一个数为正,则它的原码、反码、补码相同。
⑵一个数为负,则符号位为1,其余各位是对原码取反(符号位不变),然后整个数加1。
先用一个正数1举例
原码:0000 0001
反码:0000 0001
补码:0000 0001
正数的原码=反码=补码
对于-1来说
原码:1000 0001
反码:1111 1110(符号位不变,其他相反)
补码:1111 1111(补码是反码+1)
Java中用补码表示二进制数。
1、数值类型
(1)byte
-
-
byte数据类型是8位、有符号的,以二进制补码表示的整数;(1字节 = 8位 ) Java中正数用源码表示,负数用补码表示,第一位是符号位。
-
最小值是 -128(-2^7);
-
最大值是 127(2^7-1)
-
参考链接:
+0的原码是0000 0000
-0的原码是1000 0000
实际上,”+0“和“-0”的原码统一为0000 0000
1000 0000没有使用(避免浪费),所以就将其分给了最小的负数 -128。
-
-
默认值是0;
- byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
-
public class Test12 { public static void main(String[] args) { byte a = 127; System.out.println(a); //127 } }
相关面试题: 链接来源:
Java面试题 :byte a = (byte)128; 定义变量语句是否正确
public class Test12 {
public static void main(String[] args) {
byte a = (byte) 128;
System.out.println(a);
}
}
正确
1. 首先,分析基本数据类型
-
-
只写128,说明128是整型(int类型)
-
128L 或128F 等等,说明是long类型(L),单精度浮点类型(F)
-
(byte)128中128是整型(int),只不过是强制类型转换为了 字节类型(byte)
-
2、byte b = (byte)128; 只出现了 字节类型(byte)和整型(int),对两者具体分析
-
-
整型(int)在内存中占32位(4字节)
-
字节类型(byte)在内存中占8位
-
所以,经过强制类型转换,把int类型转化为byte类型,byte只保存了int类型的低8位,其它位都舍弃
-
有符号类型,最高位都是符号位, 1表示负数, 0表示正数
-
- 如下图解释:
-
3. 分析128
用-0的二进制补码表示到了 -128里面。
public class Test12 { public static void main(String[] args) { byte a = (byte) 128; System.out.println(a); //-0 --> -128
int类型:
原码:0000 0000 0000 0000 0000 0000 1000 0000
反码:0000 0000 0000 0000 0000 0000 1000 0000
补码:0000 0000 0000 0000 0000 0000 1000 0000
byte类型截取后8位,即:
原码:1000 0000(最高位为1,表示负数)
反码:1111 1111
补码:1000 0000(在补码的过程中,符号位不能改变),1000 0000表示的是最小值,所以是-128,这叫上溢。
byte b = (byte) 129; System.out.println(b); //-127
int类型:
原码:0000 0000 0000 0000 0000 0000 1000 0001
反码:0000 0000 0000 0000 0000 0000 1000 0001
补码:0000 0000 0000 0000 0000 0000 1000 0001
byte类型:
原码:1000 0001
反码:1111 1110
补码:1111 1111(也就是-127)
byte c = -128; System.out.println(c); //-128 byte d = (byte) (-129); System.out.println(d); //127
int类型存储
原码:1000 0000 0000 0000 0000 0000 1000 0001
反码:1111 1111 1111 1111 1111 1111 0111 1110
补码:1111 1111 1111 1111 1111 1111 0111 1111
byte类型
原码:0111 1111
反码:0111 1111
补码:0111 1111(值是127)
}
}
byte: -128 ~ 127
-
对于整数超出取值范围时:
1、首先要计算出数据的二进制
2、做截取操作,截成byte类型(取低8位)
3、截取8位后,求补码
(2)short
-
-
short数据类型是16位、有符号的以二进制补码表示的整数。(2字节)
-
最小值是 -32768(-2^15);
-
最大值是 32767(2^15 - 1);
-
-
-
Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;
-
默认值是0;
-
public class Test12 { public static void main(String[] args) { short s = 1000; System.out.println(s); //1000 short r = -20000; System.out.println(r); //-20000 } }
(3)int
-
-
int数据类型是32位、有符号的以二进制补码表示的整数;(4字节)
-
最小值是 -2147483648(-2^31);
-
最大值是 2147483647(2^31 - 1);
-
-
-
一般地整型变量默认为int类型;
-
默认值是0;
-
(4)long
-
-
long数据类型是64位、有符号的以二进制补码表示的整数;(8字节)
-
最小值是 -9223372036854775808(-2^63);
-
最大值是 9223372036854775807(2^63 -1);
-
这种类型主要使用在需要比较大整数的系统上;
- 默认值是0L;
-
(5)float
-
-
float数据类型是单精度、32位、符合IEEE 754标准的浮点数;(4字节)
-
float在储存大型浮点数组的时候可节省内存空间;
-
默认值是0.0f;
-
浮点数不能用来表示精确的值,如货币;
-
例子:float f1 = 234.5f。
-
(6)double
-
-
double数据类型是双精度、64位、符合IEEE 754标准的浮点数;(8字节)
-
浮点数的默认类型为double类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是0.0d;
-
例子:double d1 = 123.4。
-
2、字符类型
(1)char
-
-
char类型是一个单一的16位Unicode字符;(2字节)
-
最小值是’u0000’(即为0);
-
最大值是’uffff’(即为65,535); 2的16次方 -1 (2^16 -1)
-
char数据类型可以储存任何字符;
-
例子:char letter = ‘A’。
-
public class Test12 { public static void main(String[] args) { System.out.println(Character.SIZE); //16 // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 System.out.println((int)Character.MAX_VALUE); //65535 System.out.println((int)Character.MIN_VALUE); //0 } }
3、布尔类型
(1)boolean
-
-
boolean数据类型表示一位的信息;
-
只有两个取值:true和false;
-
这种类型只作为一种标志来记录true/false情况;
-
默认值是false;
-
例子:boolean one = true。
-