【C语言】八进制、十六进制

前言

在我们日常生活中使用的数往往是十进制的,而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制(尤其是2的幂相关的进制,因为这种计数系统比十进制更接近于计算机的二进制系统),所以学习和掌握这些不同进制是非常重要的。

本文将对八进制和十六进制(8和16都为2的幂)进行一些讲解。

通常情况C语言都假定整型常量是十进制的数,但在表达与计算机相关的值时,八进制和十六进制却十分方便。

十六进制,与二进制的转换

十六进制(hexadecimal或hex),是基于16的幂的计数系统。用0~15表示数,但是当数字有两位,如10、11时会产生歧义,指的是1和0还是10呢?所以我们用字母A~F来表示10~15的数,10表示为A,11即B,12即C,13即D,14即E,15即F。例如,十六进制数A3E(在C中写作0xA3E)其实是10 3 14,转化为对应的十进制数时也就是各个位去乘各个位的权重:10*16^2+3*16^1+14*16^0 = 2622。

当然,A~F也可以写成小写的字母,a~f。0xA3F == 0xa3f。

有一个非常重要的规律是:十六进制数的每一位数恰好由4位二进制数表示,或者说每一个十六进制位可以翻译为4个二进制位。

举例:十六进制的2可以表示为0010,十六进制6则是0110,所以十六进制数26的位组合(bit pattern)就是00100110,十六进制数63的位组合就是反过来,即01100010。

可以在计算器上证明一下(HEX即hexadecimal,十六进制;BIN即binary system,二进制):

可以看到这么转化的结果确实正确,是不是非常方便?

每个十六进制位都对应一个4位二进制数(即4个二进制位),所以两个十六进制位恰好对应一个8位二进制位,也就是一个字节。第1个十六进制位表示前4位,第2个十六进制位表示后4位。

由此,十六进制位非常适合表示字节值。我们调试时的内存窗口的一个00就是一个字节,把00写在一起是为了更明确地表示这是两个十六进制位也就是一个字节(没有了解过的朋友可以先跳过):

比如下面这个代码,我们在内存窗口,地址处输入&m、把列数改为4,可以看到存放m的值的四个字节(m为一个int类型也就是4个字节

1d 08 00 00是8个十六进制位,两个写一起代表一个字节,正好是4个字节

(为什么1d 08 00 00对应的十进制是2077,这涉及到大小端字节序,本文按下不表)

00000000 00000000 00001000 00011101         

//2077的二进制序列

00011101 00001000 00000000 00000000         

//小端字节序存储形式

0001 1101 0000 1000 0000 0000 0000 0000     

//把4位放在一起刚好可以翻译一个十六进制位

1       d      0       8       0       0       0       0           

//翻译为十六进制

1d 08 00 00                                                         

//2位十六进制位放一起代表一个字节

 附图:

我们可以看到十六进制每位最大的数15,也就是F,等价二进制为1111,恰好是4个二进制位能表示的最大值,这也说明了我们最多需要4个二进制位就能表示一位十六进制数。

八进制,与二进制的转换

八进制(octal),是基于8的幂的计数系统。用0~7表示数字。如八进制的432(在C中写作0432),转化十进制即:4*8^2+3*8^1+2*8^0 = 282。

同样的,八进制与二进制之间也存在非常方便的转换方法,正如十六进制转换二进制一样。对于八进制来说,规律是每个八进制位对应3个二进制位。如,八进制的0277的二进制是10111111(更方便点看就是10 111 111)。用111转换0277的最后一个7,再用111转换0277倒数第二个7,最后用010转换2,而0277最前面的0只是八进制前缀(下面会说)。

附图:

我们可以看到八进制每位最大的数7,等价二进制为111,恰好是3个二进制位能表示的最大值,这也说明了我们最多需要3个二进制位就能表示一位八进制数。

表示进制的前缀

However,有一个问题:现在我们有一个数10000,我们可以说它是十进制、十六进制或者二进制,但是计算机会认为它是十进制、十六进制还是二进制呢?

所以在C语言中,我们用特定的前缀表示一个数是什么进制。0x或0X前缀用来表示十六进制数,举例来说17的十六进制表示是0x11或0X11

八进制的情况也是类似的,我们同样需要特点的前缀表示它是一个八进制数而非其他进制,我们采用的前缀是0,举例来说17的八进制表示为021。

我们需要记住的一点是,不同的进制只是服务于更方便的表示,不会影响数值被存储的方式。不管是写成17、 021还是0x11,这个数被存储的方式都是在计算机内部以二进制进行编码

显示(打印)八进制与十六进制

当我们要让一个数以我们想要的进制显示时,就需要使用对应的转换说明。不同进制有不同的转换说明。我们最常用的%d就是以十进制显示数字;八进制显示数字,用的是%o;十六进制显示,用%x。如果我们还想要更清楚地表明显示出来的数是什么进制就需要把前缀一起显示,而显示前缀也有转换说明:%#o、%#x分别为八进制和十六进制带前缀的转换说明。当然,也可以改为大写,%#X。

演示程序

最好的掌握方法就是上手写代码,现在我们不妨写一个程序,以十进制、八进制、十六进制打印同一个数,不妨就打印2077吧:

 到此,本文就结束了,祝阅读愉快^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/332040.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux初探】:解锁开源世界的神秘钥匙

文章目录 🚀一、了解Linux🔥二、Linux 的发行版❤️三、Linux应用领域💥四、Linux vs Windows & mac 🚀一、了解Linux Linux是一种自由、开放源代码的操作系统,它的内核由芬兰计算机科学家Linus Torvalds在1991年创…

手把手从0到1教你做STM32+FreeRTOS智能家居--第10篇之ASR-PRO语音识别模块

前言 先看实验效果,通过ASR-PRO语音智能识别控制模块,来控制STM32单片机实现对应的控制功能。因为后台好多小伙伴私信问用的是什么语音模块,并且很少在网上看到如何使用此模块相关的文章,所以我将会在本篇文章详细介绍一下此模块…

HTML蓝色爱心

目录 写在前面 HTML入门 完整代码 代码分析 运行结果 系列推荐 写在后面 写在前面 最近好冷吖,小编给大家准备了一个超级炫酷的爱心,一起来看看吧! HTML入门 HTML全称为HyperText Markup Language,是一种标记语言&#…

【wiki知识库】01.wiki知识库前后端项目搭建(SpringBoot+Vue3)

📝个人主页:哈__ 期待您的关注 🌼环境准备 想要搭建自己的wiki知识库,要提前搭建好自己的开发环境,后端我使用的是SpringBoot,前端使用的是Vue3,采用前后端分离的技术实现。同时使用了Mysql数…

浪潮信息IPF24:AI+时代,创新驱动未来,携手共创智慧新纪元

如今,数字化时代的浪潮席卷全球,人工智能已经成为推动社会进步的重要引擎。浪潮信息IPF24作为行业领先的AI技术盛会,不仅为业界提供了交流合作的平台,更在激发创新活力、拓展发展路径、加速AI技术落地等方面发挥了重要作用。 升级…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除,则称数对 (i, j) 为 优质数对&#…

手机版AI写作软件哪个好用?5款AI写作软件分享

在这个快节凑的时代,人们对于高效、便捷的创作方式很是追求。尤其是在人工智能技术发展迅速的今天,AI写作软件的出现,让很多自媒体创作者都会想到在手机上面进内容创作,这样不仅能提高工作效率,而且工作的自由度会更高…

ciscn2024(上传一下,有侵权什么的问题的话联系删除)

Web Simple_php 这个Simple_php一点儿也不Simple (⋟﹏⋞) 源码放这儿了&#xff1a; <?phpini_set(open_basedir, /var/www/html/); error_reporting(0);if(isset($_POST[cmd])){$cmd escapeshellcmd($_POST[cmd]); if (!preg_match(/ls|dir|nl|nc|cat|tail|more|flag…

Java中IO流类的体系

Java为我们提供了多种多样的IO流&#xff0c;我们可以根据不同的功能及性能要求挑选合适的IO流&#xff0c;如图所示&#xff0c;为Java中IO流类的体系。 从上图发现&#xff0c;很多流都是成对出现的&#xff0c;比如&#xff1a; FileInputStream/FileOutputStream&#xff0…

vue3的api风格

Vue的组件有两种不同的风格&#xff1a;组合式API 和 选项式API 选项式api 选项式API&#xff0c;可以用包含多个选项的对象来描述组件的逻辑&#xff0c;如&#xff1a;data&#xff0c;methods&#xff0c;mounted等。 组合式api setup&#xff1a;是一个标识&#xff0c;告…

【全开源】答题考试系统源码(FastAdmin+ThinkPHP+Uniapp)

答题考试系统源码&#xff1a;构建高效、安全的在线考试平台 引言 在当今数字化时代&#xff0c;在线考试系统已成为教育机构和企业选拔人才的重要工具。一个稳定、高效、安全的答题考试系统源码是构建这样平台的核心。本文将深入探讨答题考试系统源码的关键要素&#xff0c;…

民宿bug

前端 后端 1 订单管理 订单日期已过&#xff0c;状态没有变成已完成

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后&#xff0c; 修改&#xff1a;选择桌面调试&#xff0c;如下&#xff1a; 4、打开QTcreator&#xff0c;选项中&#xff0c;配置编译器&#xff…

C++学习/复习5--构造函数与初始化/static成员/友元/内部类/匿名对象/编译器的拷贝构造优化

一、本章概要 二、再谈构造函数 1.构造体赋初值与初始化 2.初始化列表与初始化 2.1定义 2.2注意事项与举例 3.explicit关键字与构造函数 3.1隐式类型转换 也叫做自动类型转换 这种转换通常是从存储范围小的类型到存储范围大的类型&#xff0c;或者是从低精度的数值类型到高…

利用基于CNN的人员检测与关键词识别的TinyML实现无接触电梯

目录 说明 论文概述 摘要 引言 现有非接触式电梯解决方案 新解决方案的需求 tinyML实施 系统构建和算法管道 CNN和TinyML实现 结果与讨论 结论 视频演示和代码可用性 一点感想 说明 我一直使用Google Schloar订阅最新的论文消息&#xff0c;今天看到一篇论文的标…

租赁系统|北京租赁系统|租赁软件开发流程

在数字化时代的浪潮下&#xff0c;小程序成为了各行各业争相探索的新领域。租赁行业亦不例外&#xff0c;租赁小程序的开发不仅提升了用户体验&#xff0c;更为商家带来了更多商业机会。本文将详细解析租赁小程序的开发流程&#xff0c;为有志于进军小程序领域的租赁行业从业者…

【C语言】指针作为参数(传值调用vs传址调用)

前言 在前面讲了那些指针相关的内容后&#xff0c;是时候探讨一下指针有什么作用了。 在C语言中&#xff0c;指针有多种各不相同的应用&#xff0c;在本篇文章中&#xff0c;我们探讨一下指针作为函数参数的作用&#xff08;对比传值与传址两种不同函数调用方式&#xff09;。…

OS复习笔记ch6-1

死锁的原理 定义 一组进程中&#xff0c;其中每个进程因等待事件而阻塞&#xff0c;且所等待的事件只能被这组进程中的另一阻塞进程激发称之为死锁。 举例如下 四个车辆希望紧迫的希望能很快通过&#xff0c;每辆车需要两个象限的资源&#xff0c;然而四个车都只得到一个象…

【uni-best+UView】使用mitt实现自定义错误对话框

痛点 目前在设计一个uni-best的前端全局的异常提示信息&#xff0c;如果采用Toast方式&#xff0c;对微信支持的不友好。微信的7中文长度连个NPE信息都无法完整显示&#xff0c;更不用提Stacktrace的复杂报错了。如果使用对话框&#xff0c;必须在页面先预先定义&#xff0c;对…

嵌入式实时操作系统笔记3:FreeRTOS移植(STM32F407)_编写简单的FreeRTOS任务例程

上文讲到UC/OS III系统的移植&#xff0c;那篇文章是失败了的&#xff0c;网络上的资料真是层次不清&#xff0c;多有遗漏步骤&#xff0c;导致单片机连操作系统的初始化都卡在那&#xff0c;这次换个赛道&#xff0c;学FreeRTOS吧...... 今日任务如标题所示&#xff1a;FreeR…