十六进位

十六进位

十六进位(英文名称:Hexadecimal),是电脑中资料的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进位的对应关系是:0-9对应0-9;A-F对应10-15;N进位的数可以用0~(N-1)的数表示,超过9的用字母A-F。

  • 中文名称
    十六进位
  • 外文名称
    hexadecimal number system
  • 用途
    电脑中资料的一种表示方法

表示方法

十六进位照样採用位置计数法,位权是16为底的幂。对于n位整数,m位小数的十六进位数用加权系数的形式表示如下:

举例说明

16进位的20表示成10进位就是:2×16¹+0×16º=32

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

十进位数可以转换成十六进位数的方法是:十进位数的整数部分"除以16取余",十进位数的小数部分"乘16取整",进行转换。

比如说十进位的0.1转换成八进位为0.0631463146314631。就是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进位缩短了二进位数,但保持了二进位数的表达特点。在下面的关于进位转换的课程中,你可以发现这一点。

转换

二进位转换十进位

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

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

用横式计算

0×2+0×2+1×2+0×2+0×2+1×2+1×2+0×2+1×2=356

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

1×2+1×2+1×2+1×2=356

4+32+64+256 =356

八进位转换十进位

八进位就是逢8进1。

八进位数採用 0~7这八数来表达一个数。

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

所以,设有一个八进位数:1507,转换为十进位为:839,具体方法如下:

可以用横式直接计算:

7×8+0×8+5×8+1×8=839

也可以用竖式表示

第0位 7×8=7

第1位 0×8=0

第2位 5×8=320

第3位 1×8=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×16+F×16+A×16+2×16=10997

也可以用竖式表示:

第0位: 5×16=5

第1位: F×16^1=240

第2位: A×16=2560

第3位: 2×16=8192

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

10997

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

假设有人问你,十进数1234 为什麽是一千二百三十四?你尽可以给他这麽一个算式:

1234 = 1×10+2×10+3×10+4×10

十六进位互相转换

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

你可能还要这样计算:1×2+1×2+1×2+1×2=1×1+1×2+1×4+1×8=15。

然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为2=8,然后依次是 2=4,2=2,2=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÷16=30481....14(E)

30481÷16=1905....1

1905÷16=119....1

119÷16=7....7

7÷16=0....7

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

表达方法

程式的表达方法环境 格式备注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\' 表示以外,我们很少用后两种方法表示一个字元。

各码转换

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

我们已经知道电脑中,所有资料最终都是使用二进位数表达。

我们也已经学会如何将一个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进位值。

变数

下面我们来动手完成一个小小的实验,通过调试,观察变数的值。

我们在代码中声明两个int 变数,并分别初始化为5和-5。然后我们通过CB提供的调试手段,可以查看到程式运行时,这两个变数的十进位值和十六进位值。

首先写一个如下的C语言控製台程式:

设定断点:最常用的调试方法之一,使程式在运行时,暂停在某一代码位置,

在Code::Blocks中,设定断点的方法是在某一行代码上按F5或在行首栏内单击滑鼠。

我们在return 0;这一行上设定断点。断点所在行将被Code::Blocks以红色显示。

接着,运行程式(F9),程式将在断点处停下来。

(请注意两张图的不同,前面的图是运行之前,后面这张是运行中,左边的箭头表示运行运行到哪一行)

当程式停在断点的时,我们可以观察当前代码片段内,可见的变数。观察变数的方法很多种,这裏我们学习使用 Debug Inspector (调试期检视),来全面观察一个变数。

以下是调出观察某一变数的 Debug Inspector 视窗的方法:

先确保代码视窗是活动视窗。(用滑鼠点一下代码视窗)

按下Ctrl键,然后将滑鼠挪到变数 aaaa 上面,你会发现代码中的aaaa变蓝,并且出现下划线,效果如网页中的超连结,而滑鼠也变成了小手状:

点击滑鼠,将出现变数aaaa的检视视窗。

从该视窗,我可以看到:

aaaa :变数名

int :变数的资料类型

0012FF88:变数的记忆体地址,请参看5.2 变数与记忆体地址;地址总是使用十六进位表达

5 :这是变数的值,即aaaa = 5;

0x00000005 :同样是变数的值,但採用16进位表示。因为是int类型,所以佔用4位元组。

首先先关闭前面的用于观察变数aaaa的Debug Inspector视窗。

然后,我们用同样的方法来观察变数bbbb,它的值为-5,负数在电脑中使用补码表示。

正如我们所想,-5的补码为:0xFFFFFFFB。

再按一次F9,程式将从断点继续运行,然后结束。

总结

很难学的一章?

来看看我们主要学了什麽:

1、我们学会了如何将二、八、十六进位数转换为十进位数。

三种转换方法是一样的,都是使用乘法。

2、我们学会了如何将十进位数转换为二、八、十六进位数。

方法也都一样,採用除法。

3、我们学会了如何快速的地互换二进位数和十六进位数。

要诀就在于对二进位数按四位一组地转换成十六进位数。

在学习十六进位数后,我们会在很多地方採用十六进位数来替代二进位数。

4、我们学习了原码、反码、补码。

把原码的0变1,1变0,就得到反码。要得到补码,则先得反码,然后加1。

以前我们只知道正整数在电脑裏是如何表达,这时我们还知道负数在电脑裏使用其绝对值的补码表达。

比如,-5在电脑中如何表达?回答是:5的补码。

5、最后我们在上机实验中,这会了如何设定断点,如何调出Debug Inspector视窗观察变数。

以后我们会学到更多的调试方法。

标準表示

在数製使用时,常将各种数製用简码来表示:如十进位数用D表示或省略;二进位用B来表示;十六进位数用H来表示。

如:十製数123表示为:123D或者123;二进位数1011表示为:1011B;十六进位数3A4表示为:3A4H。

另外在编程中十六进位数也用"0x"作为开头。

意义

二进位

八进位

十进位

十六进位

0

1

0

1

0

1

0

1

10

2

2

2

11

3

3

3

100

4

4

4

101

5

5

5

110

6

6

6

111

7

7

7

1000

10

8

8

1001

11

9

9

1010

12

10

A

1011

13

11

B

1100

14

12

C

1101

15

13

D

1110

16

14

E

1111

17

15

F

10000

20

16

10

10001

21

17

11

10010

22

18

12

10011

23

19

13

10100

24

20

14

10101

25

21

15

10110

26

22

16

10111

27

23

17

11000

30

24

18

11001

31

25

19

11010

32

26

1A

11011

33

27

1B

11100

34

28

1C

11101

35

29

1D

11110

36

30

1E

11111

37

31

1F

100000

40

32

20

100001

41

33

21

100010

42

34

22

100011

43

35

23

100100

44

36

24

100101

45

37

25

100110

46

38

26

100111

47

39

27

101000

50

40

28

101001

51

41

29

101010

52

42

2A

101011

53

43

2B

101100

54

44

2C

101101

55

45

2D

101110

56

46

2E

101111

57

47

2F

110000

60

48

30

110001

61

49

31

110010

62

50

32

110011

63

51

33

110100

64

52

34

110101

65

53

35

110110

66

54

36

110111

67

55

37

111000

70

56

38

111001

71

57

39

111010

72

58

3A

111011

73

59

3B

111100

74

60

3C

111101

75

61

3D

111110

76

62

3E

111111

77

63

3F

1000000

100

64

40

1000001

101

65

41

1000010

102

66

42

1000011

103

67

43

1000100

104

68

44

1000101

105

69

45

1000110

106

70

46

1000111

107

71

47

1001000

110

72

48

1001001

111

73

49

1001010

112

74

4A

1001011

113

75

4B

1001100

114

76

4C

1001101

115

77

4D

1001110

116

78

4E

1001111

117

79

4F

1010000

120

80

50

1010001

121

81

51

1010010

122

82

52

1010011

123

83

53

1010100

124

84

54

1010101

125

85

55

1010110

126

86

56

1010111

127

87

57

1011000

130

88

58

1011001

131

89

59

1011010

132

90

5A

1011011

133

91

5B

1011100

134

92

5C

1011101

135

93

5D

1011110

136

94

5E

1011111

137

95

5F

1100000

140

96

60

1100001

141

97

61

1100010

142

98

62

1100011

143

99

63

1100100

144

100

64

相关词条

相关搜索

其它词条