在程序中表示什么_有趣的问题,C语言程序中,为什么十六进制数字以前缀0x开头呢?...
发布日期:2022-02-03 15:24:50 浏览次数:6 分类:技术文章

本文共 1172 字,大约阅读时间需要 3 分钟。

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

9e120da722ee992a0a422295c6d475b6.png

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

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

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

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

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

a1e7c53e6ecff73e5701d3f13b057b21.png

这样做并不是一个好的选择

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

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

845ab85efe01c628904104eca9d25348.png

使用 0 前缀表示八进制数字

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

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

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

小结

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

bbf2f90c9602cc25817f0c5889d21cd0.png

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

未经许可,禁止转载。

转载地址:https://blog.csdn.net/weixin_35600779/article/details/112660209 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:正则表达式里转义字符_12正则表达式
下一篇:怎么引jsp包_电机引接线的制作流程防护等级

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月07日 17时14分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

PL/SQL数据库管理工具的使用 2019-04-27
史上最简单的spring-boot集成websocket的实现方式 2019-04-27
带你玩转属于自己的spring-boot-starter系列(一) 2019-04-27
带你玩转属于自己自己的spring-boot-starter系列(二) 2019-04-27
带你玩转属于自己的spring-boot-starter系列(三) 2019-04-27
基于SnowFlake算法如何让分库分表中不同的ID落在同一个库的算法的实现 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分库解决方案(二) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之分表解决方案(一) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之关联查询解决方案(三) 2019-04-27
基于springboot的ShardingSphere5.X的分库分表的解决方案之基于seata的分布式事务的解决方案(十五) 2019-04-27
Linux文件管理参考 2019-04-27
FTP文件管理项目(本地云)项目日报(一) 2019-04-27
FTP文件管理项目(本地云)项目日报(二) 2019-04-27
FTP文件管理项目(本地云)项目日报(三) 2019-04-27
FTP文件管理项目(本地云)项目日报(四) 2019-04-27
【C++】勉强能看的线程池详解 2019-04-27
FTP文件管理项目(本地云)项目日报(五) 2019-04-27
FTP文件管理项目(本地云)项目日报(关于不定长包的测试) 2019-04-27
FTP文件管理项目(本地云)项目日报(六) 2019-04-27
FTP文件管理项目(本地云)项目日报(七) 2019-04-27