Java数据类型详解
整数在计算机中的存储原理
其实任何数据在计算机中都是以二进制表示的。那这里肯定有人问,什么是二进制啊?所谓二进制其实就是一种数据的表示形式,它的特点是逢2进1。
数据的表示形式除了二进制(逢2进1),八进制(逢8进1)、还有十进制(逢10进1)、十六进制(逢10进1)等。
1.二进制中只有0和1两个数
首先十进制的0和二进制的0是一样的,十进制的1和二进制的1也是 一样的。但是十进制中 有2,但是二进制中就没有2了
2.那么二进制是如何表示十进制的2呢?
1
+ 1
——————————
10 这里两个1相加,结果为2,由于二进制满2进1,所以最终结果10
3.那么二进制是如何表示十进制的3呢?
前面我们已经知道二进制10表示十进制的2,那么二进制10+1就表示十进制的3啊!
10
+ 1
—————————
11 十进制的3对应的二进制是11
4.那么二进制是如何表示十进制4的呢?
前面我们已经知道二进制11表示十进制的4,那么11+1就表示十进制的5啊
11
+ 1
—————————
100 十进制的5对应的二进制是100
前面每算一个二进制数据都是采用+1的方式,逢2进1,一个一个算出来的。有没有更
快的算出十进制对应二进制的方法呢? 这里学习一种方式:叫做除2取余法。
除2取余法
1.怎么做呢?
答:让十进制数据连续除以2,直到商为0,余数反转
2.举例1:把十进制6转换为二进制
商 余数
6/2 3 0
3/2 1 1
1/2 0 1
然后把余数反转:6对应的二进制是110
3.举例2: 把十进制13转换为二进制
商 余数
13/2 6 1
6/2 3 0
3/2 1 1
1/2 0 1
然后把余数反转:10对应的二进制是1101
二进制到十进制的转换
这里介绍一种计算方式叫做:8421码
为了便于理解,我们先在看一下十进制怎么转十进制,主要是为了让大家看到演化过程。
1.十进制转十进制
比如我们把12345进行分解:
12345 = 10000 + 2000 + 300 + 40 + 5
= 1*10^4 + 2*10^3 + 3*10^2 + 5*10^0
我们发现:
在十进制中如果把十进制的每一位从右往左从0开始编一个号,假设这一位数字
是a, 那么这一位数表示的值就是:a*10^n;
----------------------------------------------------------------------
2.二进制转十进制:
类比十进制:
如果把二进制的每一位从从右往左0开始编一个号用n表示,假设二进制的每一位是a,
那么这一位表示的十进制值是:a*2^n
1)假设二进制的每一位都是1:
128 64 32 16 8 4 2 1 每一位表示的十进制:a * 2 ^ n
7 6 5 4 3 2 1 0 编号:n
1 1 1 1 1 1 1 1 二进制的每一位:a
二进制 十进制
11111111 = 1*2^7 + 1*2^6 + 1*2^5 + ... + 1*2^0
= 128 + 64 + 32 + ... + 1
= 255
2)假设二进制的为0010001
128 64 32 16 8 4 2 1 每一位表示的十进制:a*2^n
7 6 5 4 3 2 1 0 编号:n
0 0 1 0 0 0 0 1 二进制的每一位:a
二进制 十进制
00001101 = 0*2^7 + 0*2^6 + 1*2^5 + ... + 1*2^0
= 0 + 0 + 32 + ... + 1
= 33
3)8421码:从右往左给二进制的每一位数依次按照1 2 4 8...标记
128 64 32 16 8 4 2 1
0 0 1 0 0 0 0 1
-----------------------------
只需要将1位上的数字加起来,就是二进制对应的十进制
二进制 十进制
00001101 = 8+4+1
= 13
0000111 = 4+2+1
= 7
0001111 = 8+4+2+1
= 25
二进制转八进制
前面我们说计算机中数据都是采用二进制来存储的,但是二进制阅读和编写起来都不太方便。为了便于阅读和书写,又推出了八进制、十六进制。
1.运算规则:
把二进制的每三位一组合,然后对每三位用8421码进行计算,最后拼接到一起
原因:因为111,的值是7, 再大满7就需要往进位了。
2.把二进制11001110转换为八进制数据
01 100 001 二进制每三位一组合
1 4 1 每一组进行8421码运算
----------
八进制:141
二进制转十六进制
1.运算规则:
把二进制的每四位一组合,然后对每四位用8421码进行计算,最后拼接到一起
原因:因为1111,的值是15, 再大1满16了就需要往进位了。
2.举例:把二进制11001110转换为十六进制数据
0110 0001 二进制每四位一组合
6 1 每一组进行8421码运算
----------
十六进制:61
3.练习:把111100转换为十六进制
0011 1100
3 12 由于十六进制中有a,b,c,d,e,f分别表示10,11,12,13,14,15
-----------
十六进制:3c
不同进制在Java程序中的书写格式
计算机的最小存储单位
前面我们已经知道计算机表示数据是用二进制来的, 这里我又要抛出一个问题来了! 我现在想要在计算机中存储一个整数6,转换为二进制是110,那么计算机中只是存110吗三位数字吗? 其实不是的,计算机中最小的存储单位是字节(Byte),一个字节占8位(bit),也就是说即使这个数据不足8位也需要用8位来存储。
Java的数据类型整体上来说分为两大类: 基本数据类型、引用数据类型。
基本数据类型
基本数据类型一共有4类8种,每一种数据类型占用的内存空间不一样,能够表示的数据范围也不一样。如下图所示
需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的
- 比如23,它默认就为int类型;如果加上后缀L,则为long类型;
- 比如23.8,它默认为double类型;如果加上后缀F,则为float类型;
下面定义各种类型的变量,将这8种基本数据类型都用一下。
public class TypeDemo1 {
public static void main(String[] args) {
// 目标:掌握8种基本数据类型,用来定义变量。
// 1、整型
byte number = 98;
System.out.println(number);
short number2 = 9000;
int number3 = 12323232; // 默认
// 注意:随便写一个整型字面量,默认是int类型的,73642422442424虽然没有超 过long的范围,但是它超过了本身int的范围了。
// 如果希望随便写一个整型字面量是long类型的,需要在其后面加上L/l
long number4 = 73642422442424L;
// 2、浮点型
// 注意:
// 随便写一个小数字面量,默认当成double类型对待的,
// 如果希望这个小数是float类型的,需要在后面加上:F/f
float score1 = 99.5F;
double score2 = 99.8; // 默认定义方案。
// 3、字符型
char ch1 = 'a';
char ch2 = '中';
char ch3 = '国';
// 4、布尔型
boolean b1 = true;
boolean b2 = false;
// 引用数据类型:String.
// String代表的是字符串类型,定义的变量可以用来表示字符串。
String name = "黑马 KFM";
System.out.println(name);
}
}
数据类型转换
类型转换的形式总体分为2种,一种是自动类型转换(扩展原始转换),一种是强制类型转换(缩小原始转换)。
下面就是数据类型可以转换的类型:
自动类型转换
- 什么是自动类型转换?
答:自动类型转换指的是,数据范围小的变量可以直接赋值给数据范围大的变量
byte a = 12;
int b = a; // 这里就发生了自动类型转换(把byte类型转换int类型)
- 自动类型转换的原理是怎样的?
答:自动类型转换其本质就是在较小数据类型数据前面,补了若干个字节
除了byte和int之间的转换之外,其他类型也可以转换,转换顺序如下图所示
下面我们通过代码演示一下,自动类型转换的各种形式。
public class TypeConversionDemo1 {
public static void main(String[] args) {
// 目标:理解自动类型转换机制。
byte a = 12; // 8位
int b = a; // 32位
System.out.println(a); // 12
System.out.println(b); // 12
int c = 100; // 32位
double d = c; // 64位
System.out.println(d); // 100
char ch = 'a'; // 16位
int i = ch; // 32位
System.out.println(i); // 97
}
}