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

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的相应次方并递增,小数点后则是从左往右乘以二的相应负次方并递减。

通用公式:abcd.efg(2) = d * 2 1 − 1 2^{1 - 1} 211​ + c * 2 2 − 1 2^{2-1} 221​ + b * 2 3 − 1 2^{3-1} 231​​ + a * 2 4 − 1 2^{4-1} 241​​​​ + e * 2 − 1 {2^{-1}} 21​ + f * 2 − 2 2^{-2} 22 +​​ g * 2 − 3 2^{-3} 23

01111101 转十进制

0 1 1 1 1 1 0 1

2 8 − 1 2^{8-1} 281 + 2 7 − 1 {2^{7-1}} 271 + 2 6 − 1 {2^{6-1}} 261 + 2 5 − 1 {2^{5-1}} 251 + 2 4 − 1 {2^{4-1}} 241 + 2 3 − 1 {2^{3-1}} 231 + 2 2 − 1 {2^{2-1}} 221 + 2 1 − 1 {2^{1-1}} 211

0 * 2 8 − 1 2^{8-1} 281 + 1 * 2 7 − 1 {2^{7-1}} 271 + 1 * 2 6 − 1 {2^{6-1}} 261 + 1 * 2 5 − 1 {2^{5-1}} 251 + 1 * 2 4 − 1 {2^{4-1}} 241 + 1 * 2 3 − 1 {2^{3-1}} 231 + 0 * 2 2 − 1 {2^{2-1}} 221 + 1 * 2 1 − 1 {2^{1-1}} 211

0 * 128 + 1 * 64 + 1 * 32 + 1 * 16 + 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1 = 125

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Little Tomato

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值