【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吧:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5.26机器人基础-空间描述和变换2

在前文的基础上引入平移算子和旋转算子 1.平移算子 2.旋转算子 3.变换算子

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中,很多音频、视频网站下载资源都非常不方便,要么需要安装客户端&…

联邦学习(一)

世界第一本“联邦学习”专著——《联邦学习》。作者阅读数书籍《联邦学习实战》。 1.联邦学习概述 在构件全局模型时,其效果与数据被整合在一起进行集中式训练的效果几乎一致,这便是联邦学习提出的动机和核心思想。 核心理念:数据不动模型动,数据可用不可见。 传统训练范式…

初步认识栈和队列

Hello,everyone,今天小编讲解栈和队列的知识!!! 1.栈 1.1栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&…

hsql学习笔记

1. row_number() over (partition by uid order by dt 分析: row_number(): 这是一个窗口函数,用于为结果集中的每一行分配一个唯一的序号。默认情况下,这个序号是按照查询结果的顺序来分配的,但你可以通过OVER()子句…

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类,它的一个核心作用之后呢?那下面我有一个问题想问问各位。作为mappedstatement来讲,它封装的是一个select标签或者insert标签。但是呢,我们需要大家注意的是什么&am…

文件夹打开出错?这里有你需要的数据恢复与预防指南

在日常使用电脑时,我们有时会遇到文件夹打开出错的情况。当你尝试访问某个文件夹时,系统可能会弹出一个错误提示,告诉你无法打开该文件夹。这种情况不仅会影响我们的工作效率,还可能导致重要数据的丢失。接下来,我们将…

Java进阶学习笔记24——Object类

Object类: Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。 所有类都是Object类的子孙类。 API文档: Object类的成员方法: Object类的常见方法: Student类&…

HCIP-Datacom-ARST自选题库_02_网络安全【道题】

一、单选题 1.关于网络安全性优化的内容,下列哪个选项是错误的? 管理安全 边界安全 访问控制 日志管理 2.如图所示,网络管理员为了抵御DHcP Server仿冒者攻击,在交换机上部署了DHcp snoping功能,那么以下哪一个接口应该被设…

简单的python程序,把它做成docker镜像

1,python程序准备 在linux主机的/tmp/pythontest路径下创建一个test.py程序文件, 程序内容很简单 就是一句打印 print(hello world, docker)2,再准备一个Dockerfile文件 这个Dockerfile也是放在主机linux中的/tmp/pythontest路径下&#x…

RPA+AI 应用案例集合:自动推流直播

使用场景: 自动定时推流直播 使用技术: python playwright 每个解决一个小问题 During handling of the above exception, another exception occurred:Traceback (most recent call last): File "D:\pythonTryEverything\putdonwphone\not_watch_…

队列(C语言)

文章目录 [TOC](文章目录) 前言1.队列的概念及结构2.队列的实现3.相关操作的具体实现3.1.初始化队列(QueueInit)和销毁队列(QueueDestory)3.2.队尾入队(QueuePush)和队头出队(QueuePop)3.3.判空(QueueEmpty)、获得队尾元素(QueueBack)以及获得队头元素(QueueFront) 前言 前面我…

数据清洗操作及众所周知【数据分析】

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …

如何从零开始搭建公司自动化测试框架?

搭建的自动化测试框架要包括API测试,UI测试,APP测试三类。以上三类其实可以简化为两类,那就是: 1)接口自动化测试框架搭建 2)UI自动化测试框架搭建。 没问题,安排,且是手把手教你…

国内服务器未备案使用域名443访问的方法

参考国内服务器未备案使用域名443访问的方法 | LogDicthttps://www.logdict.com/archives/guo-nei-fu-wu-qi-wu-fa-shi-yong-yu-ming-de-jie-jue-fang-fa

科林Linux6_网络

#include<sys/socket.h> #include<arpa/inet.h> //大小端转换 #include<netdb.h> //DNS一、Socket套接字 为了开发网络应用&#xff0c;系统提供一套API函数接口&#xff0c;用于网络应用开发&#xff0c;这些接口称为套接字函数 struct sockaddr_in…

【C++ —— 哈希】学习笔记 | 模拟实现封装unordered_map和unordered_set

文章目录 前言一、unordered系列关联式容器1.1 unordered_map1.2 unordered_set 二、底层结构2.1哈希概念&#xff08;哈希是一种算法思想&#xff09;2.2哈希冲突2.3 解决哈希冲突方法&#xff1a;1.直接定址法&#xff08;值和位置关系是唯一关系&#xff0c;每个人都有唯一位…

python画图:matpolt,设置图片尺寸,字体大小,副坐标轴,保存

文章重心: 写论文的时候,图片的大小,字体的大小,副坐标轴,这些都是很重要的因素,保存一下之前用过的画图代码单图多图(两个子图)堆叠柱状图两个Y轴的图问题: python保存的时候,我选择的是svg,但是这样图片会比较大,查重什么的需要把图片都删了(一般有文件大小限制…

网页出现为了更好的体验,请将手机竖过来

前言 网站:https://act.xinyue.qq.com/commercial/act/af93dc75d9fc541d4833f05e98a9f54b6pre/index.html 发现必须要手机端才可以,否则显示"为了更好的体验,请将手机竖过来"的提示信息 很好奇怎么做的,UA?发现更改UA后依旧显示,后面看代码就知道了 可以看到是通过…

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元&#xff08;ALU&#xff09; 3.1.2 累加器A 3.1.3 程序状态字寄存器&#xff08;PSW&#xff09…