admin 管理员组

文章数量: 1087135


2024年12月21日发(作者:霹雳十大基佬)

十六进制及进制间的转换

举例说明

16进制的20表示成10进制就是:2×16

1

+0×16

0

=32

10进制的32表示成16进制就是:20

十进制数可以转换成十六进制数的方法是:十进制数的整数部分

“除以16取余”,十进制数的小数部分“乘16取整”,进行转换。

比如说十进制的0.1转换成八进制为0.4631。就

是0.1乘以8=0.8,不足1不取整,0.8乘以8=6.4,取整数6, 0.4

乘以8=3.2,取整数3,依次下算。

编程中,我们常用的还是10进制.毕竟C/C++是高级语言。

比如:

int a = 100,b = 99;

不过,由于数据在计算机中的表示,最终以二进制的形式存在,

所以有时候使用二进制,可以更直观地解决问题。但二进制数太长了。

比如int 类型占用4个字节,32位。比如100,用int类型的二进制

数表达将是:

0000 0000 0000 0000 0110 0100

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,

C++ 没有提供在代码直接写二进制数的方法。用16进制或8进制可

以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,

为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?2、

8、16,分别是2的1次方、3次方、4次方。这一点使得三种进制之

间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保

持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以

发现这一点。

3转换

二进制转换十进制

二进制数第0位的权值是2的0次方,第1位的权值是2的1次

方……

所以,设有一个二进制数:101100100,转换为10进制为:356

用横式计算

0×20+0×21+1×22+0×23+0×24+1×25+1×26+0×27+1×28

=356

0乘以多少都是0,所以我们也可以直接跳过值为0的位:

1×22+1×25+1×26+1×28=356

4+32+64+256 =356

八进制转换十进制

八进制就是逢8进1。

八进制数采用 0~7这八数来表达一个数。

八进制数第0位的权值为8的0次方,第1位权值为8的1次方,

第2位权值为8的2次方……

所以,设有一个八进制数:1507,转换为十进制为:839,具体

方法如下:

可以用横式直接计算:

7×80+0×81+5×82+1×83=839

也可以用竖式表示

第0位 7×80=7

第1位 0×81=0

第2位 5×82=320

第3位 1×83=512

十六进制转换十进制

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们

用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,

15。字母不区分大小写。

十六进制数的第0位的权值为16的0次方,第1位的权值为16

的1次方,第2位的权值为16的2次方……

所以,在第N(N从0开始)位上,如果是数β (β大于等于0,

并且β小于等于 15,即:F)表示的大小为 β×16的N次方。

假设有一个十六进数 2AF5

直接计算就是:

5×160+F×161+A×162+2×163=10997[1]

也可以用竖式表示:

第0位: 5×160=5

第1位: F×16^1=240

第2位: A×162=2560

第3位: 2×163=8192

-------------------------------

10997

此处可以看出,所有进制换算成10进制,关键在于各自的权值不

同。

假设有人问你,十进数1234 为什么是一千二百三十四?你尽可以

给他这么一个算式:

1234 = 1×103+2×102+3×101+4×100

十六进制互相转换

首先我们来看一个二进制数:1111,它是多少呢?

你可能还要这样计算:

1×20+1×21+1×22+1×23=1×1+1×2+1×4+1×8=15。

然而,由于1111才4位,所以我们必须直接记住它每一位的权

值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为

23=8,然后依次是 22=4,21=2,20=1。

记住8421,对于任意一个4位的二进制数,我们都可以很快算出

它对应的10进制值。

下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

仅4位的2进制数 快速计算方法 十进制值 十六进制

1111 = 8 + 4 + 2 + 1 = 15 =F

1110 = 8 + 4 + 2 + 0 = 14= E

1101 = 8 + 4 + 0 + 1 = 13= D

1100 = 8 + 4 + 0 + 0 = 12 =C

1011 = 8 + 0 + 2 + 1 = 11= B

1010 = 8 + 0 + 2 + 0 = 10 =A

1001 = 8 + 0 + 0 + 1 =9 =9

……

0001 = 0 + 0 + 0 + 1 = 1= 1

0000 = 0 + 0 + 0 + 0 = 0= 0

二进制数要转换为十六进制,就是以4位一段,分别转换为十六

进制。

如(上行为二制数,下面为对应的十六进制):

1111 1101 , 1010 0101 , 1001 1011

F D , A 5 , 9 B

反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

先转换F:

看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),

然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :

1111。

接着转换D

看到D,知道它是13,13如何用8421凑呢?应该是:8 + 4 +

1,即:1101。

所以,FD转换为二进制数,为:1111 1101

由于十六进制转换成二进制相当直接,所以,我们需要将一个十

进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2

进制。

比如,十进制数 1234转换成二制数,如果要一直除以2,直接得

到2进制数,需要计算较多次数。所以我们可以先除以16,得到16

进制数:

被除数 计算过程 商 余数

1234 1234/16 77 2

77 77/16 4 13 (D)

4 4/16 0 4

结果16进制为:4D2

然后我们可直接写出4D2的二进制形式:

0100 1101 0010

其中对映关系为:

0100 -- 4

1101 -- D

0010 -- 2

同样,如果一个二进制数很长,我们需要将它转换成10进制数时,

除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,

然后再转换为10进制。

下面举例一个int类型的二进制数:

01101101 11100101 10101111 00011011

我们按四位一组转换为16进制:6D E5 AF 1B

十进制转十六进制

采余数定理分解,例如将487710转成十六进制:

487710÷14(E)

30481÷1

1905÷1

119÷7

7÷7

这样就计到487710(10)=7711E(16)

4表达方法

程序的表达方法环境 格式备注URL%hex无 XML,XHTML&#xhex

无HTML,CSS#hex6位,表示颜色UnicodeU+hex6位,表示字符编码

MIME=hex无Modula-2#hex无Smalltalk,ALGOL 6816rhex无

Common Lisp#xhex或#16rhex无IPv68个hex用:分隔无

C C++的表达方法

如果不使用特殊的书写形式,16进制数也会和10进制相混。随

便一个数:9876,就看不出它是16进制或10进制。

C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16

进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。

其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母

O)

以下是一些用法示例:

int a = 0x100F;

int b = 0x70 + a;

至此,我们学完了所有进制:10进制,8进制,16进制数的表达

方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12

表示正12,而-12表示负12,;但8进制和16进制只能表达无符号

的正整数,如果你在代码中写:-078,或者写:-0xF2,C,C++并不把

它当成一个负数。

在转义符中的使用

转义符也可以接一个16进制数来表示一个字符。如 '?' 字符,

可以有以下表达方式:

'?' //直接输入字符

'77' //用八进制,此时可以省略开头的0

'0x3F' //用十六进制

同样,这一小节只用于了解。除了空字符用八进制数 '0' 表示

以外,我们很少用后两种方法表示一个字符。

5各码转换

结束了各种进制的转换,我们来谈谈另一个话题:原码、反码、

补码。

我们已经知道计算机中,所有数据最终都是使用二进制数表达。

我们也已经学会如何将一个10进制数如何转换为二进制数。

不过,我们仍然没有学习一个负数如何用二进制表达。

比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算

机中表示为:5

00000000 00000000 00000000 00000101

转换成二制是101,不过int类型的数占用4字节(32位),所

以前面填了一堆0。

想知道,-5在计算机中如何表示吗?

在计算机中,负数以其正值的补码形式表达。

什么叫补码呢?这得从原码,反码说起。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如

00000000 00000000 00000000

00000101

是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数

的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:

00000000 00000000 00000000

00000101

每一位取反,得11111111 11111111 11111111 11111010。

称:11111111 11111111 11111111 11111010 是

00000000 00000000 00000000

00000101

的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 11111010

00000000 00000000 00000000

00000101

互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,

所得数称为补码。

比如:

00000000 00000000 00000000

00000101

的反码是:

11111111 11111111 11111111 11111010

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111

11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111

11111011。转换为十六进制:0xFFFFFFFB。

再举一例,我们来看整数-1在计算机中如何表示。

假设这也是一个int类型,那么:

1、先取1的原码:

00000000 00000000 00000000

00000001

2、得反码:

11111111 11111111 11111111 11111110

3、得补码:

11111111 11111111 11111111 11111111

可见,-1在计算机里用二进制表达就是全1。16进制为:

0xFFFFFFFF。

一切都是纸上说的……说-1在计算机里表达为0xFFFFFFFF,我

能不能亲眼看一看呢?当然可以。利用C++ Builder的调试功能,我

们可以看到每个变量的16进制值。

意义

1. 用于计算机领域的一种重要的数制。

2. 对计算机理论的描述,计算机硬件电路的设计都是很有益的。

比如逻辑电路设计中,既要考虑功能的完备,还要考虑用尽可能少的

硬件,十六进制就能起到一些理论分析的作用。比如四位二进制电路,

最多就是十六种状态,也就是一种十六进制形式,只有这十六种状态

都被用上了或者尽可能多的被用上,硬件资源才发挥了尽可能大的作

用。

3. 十六进制更简短,因为换算的时候一位16进制数可以顶4位2

进制数。

4. 你可以在二进制前加几个0,意义不变。

二进制

0

1

10

11

100

101

110

111

1000

1001

1010

1011

1100

1101

1110

1111

10000

10001

八进制

0

1

2

3

4

5

6

7

10

11

12

13

14

15

16

17

20

21

十进制

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

十六进制

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

10

11

10010

10011

10100

10101

10110

10111

11000

11001

11010

11011

11100

11101

11110

11111

100000

100001

100010

100011

100100

100101

100110

100111

101000

101001

101010

101011

101100

101101

101110

101111

110000

110001

22

23

24

25

26

27

30

31

32

33

34

35

36

37

40

41

42

43

44

45

46

47

50

51

52

53

54

55

56

57

60

61

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

12

13

14

15

16

17

18

19

1A

1B

1C

1D

1E

1F

20

21

22

23

24

25

26

27

28

29

2A

2B

2C

2D

2E

2F

30

31

110010

110011

110100

110101

110110

110111

111000

111001

111010

111011

111100

111101

111110

111111

62

63

64

65

66

67

70

71

72

73

74

75

76

77

50

51

52

53

54

55

56

57

58

59

60

61

62

63

32

33

34

35

36

37

38

39

3A

3B

3C

3D

3E

3F

。。。。。。。。。。。。。。。。。。。。。。。。。。


本文标签: 进制 二进制 表示 表达