9

在C语言中,为什么十六进制的数字前缀用 0x 呢?

 3 years ago
source link: https://blog.popkx.com/%E5%9C%A8c%E8%AF%AD%E8%A8%80%E4%B8%AD-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8D%81%E5%85%AD%E8%BF%9B%E5%88%B6%E7%9A%84%E6%95%B0%E5%AD%97%E5%89%8D%E7%BC%80%E7%94%A8-0x-%E5%91%A2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在C语言中,为什么十六进制的数字前缀用 0x 呢?

发表于 2019-08-26 08:08:57   |   已被 访问: 1,114 次   |   分类于:   C语言   |   暂无评论

C语言允许程序员逐位操作变量,此时,最直观的数字表示方式自然是二进制。不过这样常常会让数字看起来“过长”,例如十进制的 255 使用二进制表示为 11111111,因此,在C语言程序开发中,为了程序员阅读代码的方便,需要逐位操作变量时,常常使用十六进制。0xFF 看起来可比 0b11111111 直观多了。

在C语言中,为什么十六进制的数字前缀用 0x 呢?

在C语言中,十六进制的数字常常以 0x 或者 0X 前缀开头,这是印在很多程序员骨子里的东西。一个有趣的问题是,为什么十六进制数字以 0x 开头呢?这样做有什么历史渊源或者特别的好处吗?

联想一下:C语言中的八进制是以前缀“0”开头的,例如 04524 就表示一个八进制数字,它等于十进制的 2388。现在想象一下,怎样表示十六进制数字呢?能像汇编那样,在数字尾部添加后缀“h”吗?例如,80h 表示十六进制的 80(它等于十进制的 128)。

不幸的是,十六进制数字还有 ABCDEF 字符,如果在某段C语言代码中,出现了字母开头的数字,例如 F0h,C语言编译器是将其解释为变量呢?还是数字呢?因此这样做并不是一个好的选择。

类似的,还有将 h 放在数字前面,或者 x 放在数字前面表示十六进制,也会带来同样的问题。

事实上,早在上世纪 60 年代,最流行的编程数字系统是十进制和八进制,那个时候的机器中每字节的位数是不确定的,有的机器中每字节有 12 位,还有 24 位,36 位的,可以很好地被 3=log2(8)整除。

BCPL 语言使用符号 8 1234 表示八进制数字,后来 Ken Thompson 根据 BCPL 语言创立了 B 语言,他修改了这一表示方法——使用 0 前缀表示八进制数字,这样的改进带来了一系列好处:

  • 对于编译器来说,整型常量总是可以由单个标记(token)组成。
  • 编译器仍然可以准确的识别出这是一个数字。
  • 编译器可以立即识别这是八进制数字。
  • 00005 和 05 是相等的。
  • 不需要使用特殊字符(例如1234表示)。

后来 Thompson 从 B 语言创立C语言时,保留了这一特性。后来发现十六进制数字用起来很方便,选择了 0x 作为十六进制数字的前缀。

简单来说,十六进制的前缀 0x 或者 0X 中的 0 是用于告诉编译器这是一个数字,这有一点点历史渊源在里面,也有一些好处。而 x 则可以认为是任意选择的符号(hexcimal)了。

阅读更多:   C语言


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK