背景

计算机世界中只有二进制 01010101…
那么在计算机中存储和运算的所有数据都要转为二进制,包括数字、字符、图片、声音、视频等。

2.8.1 进制(了解)

进制也就是进位计数制,是人为定义的带进位的计数方法

进制的分类

十进制

数字组成:0-9
进位规则:逢十进一

二进制

数字组成:0-1
进位规则:逢二进一
十进制的 256,二进制:100000000,为了缩短二进制的表示,又要贴近二进制,在程序中引入八进制和十六进制

八进制

数字组成:0-7
进位规则:逢八进一
与二进制换算规则:每三位二进制是一位八进制值

十六进制

数字组成:0-9,a-f
进位规则:逢十六进一
与二进制换算规则:每四位二进制是一位十六进制值

2、进制的换算

十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 a或A
11 1011 13 b或B
12 1100 14 c或C
13 1101 15 d或D
14 1110 16 e或E
15 1111 17 f或F
16 10000 20 10

十进制数据转成二进制数据:使用除以2倒取余数的方式
image.png
二进制数据转成十进制数据:从右边开始依次是2的0次,2的1次,2的2次。。。。
image.png
二进制数据转八进制数据:从右边开始,三位一组
image.png
二进制数据转十六进制数据:从右边开始,四位一组
image.png

在代码中如何表示四种进制的值

分别用四种类型的进制来表示10

十进制:正常表示

  1. System.out.println(10);

二进制:0b或0B开头

System.out.println(0B10);

八进制:0开头

System.out.println(010);

十六进制:0x或0X开头

System.out.println(0X10);

2.8.2 计算机存储单位

  • 字节(Byte):是计算机信息技术用于计量存储容量的一种计量单位,一字节等于八位
  • 位(bit):是数据存储的最小单位,也就是二进制。二进制数系统中,每个0或1就是一个位,叫做 bit(比特),其中8 bit 就称为一个字节(Byte)
  • 转换关系:
    • 8 bit = 1 Byte
    • 1024 Byte = 1 KB
    • 1024 KB = 1 MB
    • 1024 MB = 1 GB
    • 1024 GB = 1 TB

2.8.3 Java的基本数据类型的存储范围

整型系列

byte:字节类型

  • 占内存:1 个字节
  • 存储范围:-128~127

short:短整型类型

  • 占内存:2 个字节
  • 存储范围:-32768~32767

int:整型

  • 占内存:4 个字节
  • 存储范围:-2 的 31次方 ~ 2 的 31次方-1

long:整型

  • 占内存:8 个字节
  • 存储范围:-2 的 63次方 ~ 2 的 63次方-1

注意

如果要表示某个超过 int 范围的常量整数,那么它是 long 类型,那么需要在数字后面加 L

浮点型系列(小数)

float:单精度浮点型

  • 占内存:4 个字节
  • 精度:科学记数法的小数点后 6~7 位

注意

如果要表示某个常量小数是 float 类型,必须在数字后面加 F 或 f,否则就是 double 类型

double:双精度浮点型

  • 占内存:8 个字节
  • 精度:科学记数法的小数点后 15~16 位
    float f = 12.0F;//右边如果赋值小数常量值,那么必须加F或f
    

单字符类型:char

占内存:2 个字节

布尔类型

boolean:只能存储true或false

注意

  • 虽然计算机底层使用 0 和 1 表示 false 和 true,但是在代码中不能给 boolean 类型的变量赋值 0 和 1,只能赋值 false 和 true
  • 不要和 Python 搞混了

2.8.4 计算机如何存储数据(了解)

补码与符号位

计算机数据的存储使用二进制补码形式存储,并且最高位是符号位,1是负数,0是正数。

规定

正数的补码与反码、原码一样,称为三码合一;
负数的补码与反码、原码不一样:
负数的原码:把十进制转为二进制,然后最高位设置为1
负数的反码:在原码的基础上,最高位(符号位)不变,其余位取反(0变1,1变0)
负数的补码:反码+1

例如:byte类型(1个字节,8位)
25 ==> 原码 0001 1001 ==> 反码 0001 1001 —>补码 0001 1001
-25 ==>原码 1001 1001 ==> 反码1110 0110 ==>补码 1110 0111

一个字节可以存储的数据范围是多少?

无符号

不考虑正负数
8bit 就是 0-255

有符号

1个字节:8位
0000 0001 ~ 0111 111 ==> 1~127
1000 0001 ~ 1111 1111 ==> -127 ~ -1
0000 0000 ==>0
1000 0000 ==> -128(特殊规定)

如何存储小数

  • 为什么 float(4个字节)比 long(8个字节)的存储范围大?
  • 为什么 double(8个字节)比 float(4个字节)精度范围大?
  • 为什么 float 和 double 不精确

因为 float、double 底层也是二进制,先把小数转为二进制,然后把二进制表示为科学记数法,然后只保存:
① 符号位 ② 指数位③ 尾数位
2.11 float 和 double 数据的存储方式

如何存储字符

Java 中使用的字符集:Unicode 字符集

编码表

在计算机的内部都是二进制的 0、1 数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念
编码表就是将人类的文字和一个十进制数进行对应起来组成一张表格,例如:

字符 数值
0 48
A 65
a 97

将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表 ASCII(American Standard Code for Information Interchange 美国标准信息交换码)。

Unicode(统一码、万国码、单一码)

是计算机科学领域里的一项业界标准,包括字符集、编码方案等
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求

字符常量的几种表示方式

‘一个字符’

例如:’A’,’0’,’尚’

转义字符

\n:换行
\r:回车
\t:Tab键
\\:\
\":"
\':'
\b:删除键Backspace

System.out.println('\\');
System.out.println("hello\tworld\njava");

\u字符的Unicode编码值的十六进制型

例如:’\u5c1a’代表’尚’

char c = '\u5c1a';
char c = '尚';
String s = '尚';//错误的,哪怕是一个字符,也要使用双引号

char c2 = '';//错误,单引号中有且只能有一个字符
String s2 = "";//可以,双引号中可以没有其他字符,表示是空字符串

直接给 char 类型变量赋值十进制的 0~65535 之间的 Unicode 编码值

例如:

  • ‘尚’ 的编码值是23578
  • ‘a’的编码值是97 ```java char c1 = 23578; System.out.println(c1);//尚

char c2 = 97; System.out.println(c2);//a ```