05、二进制、原码、反码、补码和字符编码

时间:2024-03-02 07:42:17

3.5.1、什么是二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

二进制中第一位是符号位,表示正负,0正数,1负数。例如:1的二进制 00000001 ,-1的二进制 100000001

// 满二进一原则
1			2	3		4		
00000001	00000010	00000011	00000100	
5			6	7		8		9
00000101	00000110	00000111	00001000	00001001

3.5.2、十进制转二进制

十进制转换成为二进制将该数字不断除以2直到商为零,然后将余数由下至上依次写出,即可得到该数字的二进制表示。

125转换成为二进制:

125	/ 2	=	62	······	1
63	/ 2	=	31	······	0
31	/ 2	=	15	······	1
15	/ 2	=	7	······	1
7	/ 2	=	3	······	1
3	/ 2	=	1	······	1
1	/ 2	=	0	······	1

当商为零时,将余数由下至上依次写出,即为125的二进制表示。

// 因为125是正数,所以符号位为0
125的二进制为:01111101

-520转换成为二进制:

520	/ 2	=	260	······	0
260	/ 2	=	130	······	0
130	/ 2	=	65	······	0
65	/ 2	=	32	······	1
32	/ 2	=	16	······	0
16	/ 2	=	8	······	0
8	/ 2	=	4	······	0
4	/ 2	=	2	······	0
2	/ 2	=	1	······	0
1	/ 2	=	0	······	1

当商为零时,将余数由下至上依次写出,即为-520的二进制表示。

// 因为520是负数,所以符号位为1
-520的二进制为:10000010 00001000

3.5.3、二进制转十进制

方法一:小数点前或者整数要从右到左用二进制的每个数去乘以2的相应次方并递增,小数点后则是从左往右乘以二的相应负次方并递减。

image

3.5.4、原码

原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制

[+1]原码	= 01111101
[-1]原码	= 11111101

[01111101, 11111101]	==>		[-125, 125]

3.5.5、反码

  • 正数的反码是其本身
  • 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
[+1]	= 	01111101[原码]	= 	01111101[反码]
[-1]	= 	11111101[原码]	=	10000010[反码]

3.5.6、补码

注意:计算机在底层储数据的时候,使用的是补码

  • 正数的补码就是其本身。

  • 负数的补码是在其原码的基础上, 符号位不变,其余各位取反,最后+1 (即在反码的基础上+1)

[+1]	= 	01111101[原码]	= 	01111101[反码]	=	01111101[补码]
[-1]	= 	11111101[原码]	=	10000010[反码]	=	10000011[补码]

3.5.7、字符编码

什么是字符编码?

  • 字符编码是人为的定义的一套转换表。
  • 在字符编码中规定了一系列的文字对应的二进制。
  • 字符编码其实本质上就是一本字典,该字段中描述了文字与二进制之间的对照关系。
  • 字符编码是人为规定的(是某个计算机协会规定的)

字符编码涉及到编码和解码两个过程中,编码和解码的时候必须采用同一套字符编码方式,不然会出现乱码。

关于字符编码的发展过程,起初的时候计算机是不支持文字的,只支持科学计算。

实际上计算机起初是为了战争而开发的,计算导弹的轨道......

后来随着计算机的发展,计算机开始支持文字,最先支持的文字是英文,英文对应的字符编码方式是: ASCII码。

ASCII码采用1byte进行存储,因为英文字母是26个(键盘上所有的键全部算上也超不过256个,1byte可以表示256中不同情况。所以英文本身在计算机方面就占有优势)

a代表数字是97,进行编码后是01100001,进行解码是a,假如编码和解码不是同一种方式就会出现乱码

‘a’		--->	97		01100001
‘b’		--->	98		01100010
......

‘A’		--->	64		01000000
‘B’		--->	65		01000001
......

‘0’		--->	48		00110000
‘1’		--->	49		00110001
......

随着计算机语言的发展,后来国际标准组织制定了ISO-8859-1编码方式,又称为latin-1编码方式,向上兼容ASCII码,但不支持中文。

后来发展到亚洲,才支持中文、日文、韩文...

中文这块的编码方式:GB2312 < GBK < GB18030(容量关系)

繁体中文:big5(*使用的是大五码)

而Java语言为了支持全球所有的文字,采用了一种字符编码方式叫做unicode编码。Unicode编码容纳了全球所有的文字,支持所有的文字。常见包括有:UTF-8 UTF-16 UTF-32...

原创博主:Little Tomcat
博主原文链接:https://mp.weixin.qq.com/s/1BO_DRstr9I5KAlqJ84eMA