详解2进制,10进制,16进制,8进制,36进制
本篇介绍C/C++语言中的进制的概念,主要介绍2进制、10进制、16进制,这三种是编程时必须掌握的也是最经常使用的。另外,介绍8进制和36进制,当中 36进制在实际project项目中会遇到。 (本文选自《C/C++学习指南》。邵发。附录“2进制,10进制,16进制”)
讲2进制、10进制、16进制的视频教程,点击观看
权利声明:作者拥有本书的所有权利。
作者授权不论什么人都能够自由转载本站点公布的内容,但转载时必须遵守下面限制: ①转载时必须全文转载。不得有不论什么改动,必须包括“权利声明”和“官网地址” ② 仅限于网络转载,即终于结果发布于网络上。凡是不遵守以上两条的转载行为视为侵权行为。
除非本人同意。不论什么人不得将本站点内容内容用于不论什么的其它用途。
官网地址: http://www.afanihao.cn/ 留言请到http://www.afanihao.cn/kbase/
1.1 引例一
先给出一段代码,请读者如今马上编译执行一遍。观察结果。
#include <stdio.h>
void main()
{int a = 'A';int b = 65;int c = 0x41;printf("%d, %d, %d \n", a, b, c);
}
假设你还没有动手编译,那么请马上终止阅读本书,由于本书不是为太懒的人准备的。全部代码和演示样例,请读者务必自己手打一遍,不要拷贝。假设你是拷贝过去的,请马上烧掉本书。谢谢。
你会发现,输出结果为:
是的,变量a,b,c的值全然同样。实际上,这三种初始化(赋值)方法是全然等价的,仅仅是写法不一样而已。
你用哪一种办法都能够。
1.2 引例二
再给出还有一段代码,请马上编译和执行一下:
#include <stdio.h>
void main()
{char a = 65;printf("%d, %02X , %c \n", a, a, a);
}
它的执行结果为:
是的,对于同一个整数a。当它作为十进制显示时。显示为65;当作为十六进制显示为,显示为41,当作为字符显示时,显示A。
1.3 引例三
假设上面的样例给你的印象还不够深刻。再尝试一个样例:
#include <stdio.h>
void main()
{// 下面变量a和b的值是同样的int a = 0x12345678;int b = 305419896;printf("%d, %d \n", a, b);// buf的内容为"ABC"char buf[4] = { 0x41, 66, 'C' , 0};printf("%s \n", buf);
}
结果为:
1.4 整型变量的2进制表示
本节内容对理解本章乃至全书都极为重要。假设你理解了,那么所谓进制问题对你就不再是个问题。
首先,在第三章中已经明白的强调。每一个变量都是具有一个内存地址的。对于char型变量来说。在内存中占了1个字节。对于int型变量来说,在内存中占了4个字节。
为了让你更easy的理解,我们就先从char開始吧。
然后,我们看一下在计算机的内存里。倒底是怎么存储的。我们从最最简单的数開始。比如。定义一个变量 char a = 13,此变量a占了一个字节的内存。
在内存中,一个字节有8个位(bit),每个位能够是1或0。
那么a的表示为:
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
就是说,在物理内存中,它就是这么存储的。
至于物理上怎样表示1,怎样表示0,读者是不须要关心的。
你能够简单地觉得一个位就相应一个“开关”。1表示打开,0表示关闭。以后,我们就称它的按位表示为 0000 1101 。
所以,char a = 13 或者char a = 0x0C ,这两种写法表示的意思是一样的:分配一个变量,相应一个字节。字节的按位物理表示为 0000 1101。
明确了吗?所谓10进制还是16进制是对人类而言的。不是同的说法。
可是对于计算机而言,要存储这个数值。就是要用8个位(相应8个物理开关)。
这是哲学上的“形式和内容”的关系。
反过来,已经知道一个变量a的内存表示为 0000 1101,我们想在控制台上把它的值显示出来。
那么能够按10进制显示。也能够按16进制显示。
对你是小学生水平,那好吧,作为程序猿我仅仅好给按10进制显示给你了。
printf (" %d ", a);
假设你有碰巧看过本书,那好吧。我给按16进制显示:
printf(" %02X ", a);
1.5 进制换算
这一节介绍的是数学里的内容。
作者的数学水平不高,在这里仅仅能让你大概地理解一下。
实际上,正如作者一再强调的。编程不须要太高的数学水平,差点儿对数学是没有要求的。
首先。说说从16进制到10进制的换算。我们知道,0x41(十六进制) 和65(十进制)是等价的。那么怎么手工计算呢?以下给出演示样例:(以下不是代码,是在草稿纸的手算方法)
0x41 = 4 * 16 + 1 = 65
0x12345678 = 1 * 167 + 2 * 166 + 3*165 + 4 * 164 + 5 * 163 + 6 * 162 + 7 *161 + 8 = 305419896
能够看出。对于16进制,每个数字上的权重就是 16n-1 (即16的n-1次方)
然后,说说从2进制到10进制的换算。
0000 1101 = 0 + 0 + 0 + 0 + 8 + 4 + 0 + 1 = 13
或者严格一点:
0000 1101 = 0 + 0 + 0 + 0 + 23 + 22+ 0 + 1 = 13
能够看出,对于2进制,每个数字上的权重就是2n-1(即2的n-1次方)
1.6 怎样打印2进制
在printf參数中,使用控制符%d能够按10进制打印。使用%X能够按16进制打印。那么,有没有按2进制打印呢?
非常遗憾,printf不能直接打印二进制。
为了弥补这个遗憾,作者贡献一个按2进制打印的函数。
#include <stdio.h>// 把一个整数转成二进制字符串
// value: 输入整数
// buf: 输出字符串
// num_of_bits: 指定要打印的位数
void to_binary(unsigned int value, char buf[], int num_of_bits)
{for(int i=0; i<num_of_bits; i++){unsigned int mask = 1 << (num_of_bits -1 - i);if ( value & mask)buf[i] = '1';elsebuf[i] = '0';}buf[num_of_bits] = 0;
}void main()
{char buf[33];to_binary(135, buf, 8);printf("%s \n", buf);
}
1.7 8进制
8进制在project实际中一般不会用到。这个使用方法没有价值。和前面的类似。8进制表示每一个数字的权重是8n-1(即8的n-1次方)。比如,15(八进制)等于13(十进制)。
在C/C++语言中,八进制的字面常量以0开头。
比如以下的代码。
#include <stdio.h>
void main()
{int a = 015; // 以0开头表示八进制int b = 0x0D; // 以0x开头表示十六进制int c = 13; // 十进制printf("%d, %d, %d \n", a, b, c);
}
1.8 36进制
正如序列 0, 1, 2, ..., 9, A, ..., F来表示16进制一样,用序列0, 1, 2, ...,9, A, B, ..., Y, Z来表示36进制。其运算方法也全然是一样的,每个数字的权重是36n-1(36的n-1次方)。
比如。(下面不是代码。是草稿纸上的手算方法)
2Z = 36 * 2 + 35 = 107
其实,36进制在project实践中是一个非常实用的知识。比方。相同用4个字符来表示数字。使用10进制能够表示0000~9999,使用16进制能够表示0000~FFFF,使用36进制能够表示0000~ZZZZ。
能够,使用36进制的表示能力最强。
转载于:https://www.cnblogs.com/mengfanrong/p/5180228.html
详解2进制,10进制,16进制,8进制,36进制相关推荐
- 一文详解最常用的10个「激活函数」
本文转自机器之心. 激活函数是神经网络模型重要的组成部分,本文作者Sukanya Bag从激活函数的数学原理出发,详解了十种激活函数的优缺点. 激活函数(Activation Function)是一种 ...
- win10任务栏怎么还原到下面_详解:新版 WIN 10 V2004 任务栏和开始菜单全透明
是不是很酷炫?继续往下看,你也可以简单做到 导语 本文将告诉你如何借助一个小工具,将最新版 WIN 10 开始菜单和任务栏设置成全透明,以获得超酷的视觉体验.安装和设置都很简单,关键是一定要找到适合 ...
- 详解:新版 WIN 10 V2004 任务栏和开始菜单全透明
是不是很酷炫?继续往下看,你也可以简单做到 导语 本文将告诉你如何借助一个小工具,将最新版 WIN 10 开始菜单和任务栏设置成全透明,以获得超酷的视觉体验.安装和设置都很简单,关键是一定要找到适合 ...
- 详解如何在Windows 10系统中安装DeskScapes
最近有Win10系统用户反映,在安装DeskScapes时发现步骤很多,不知道具体是要怎样安装,不敢随意操作,这令用户觉得非常苦恼.DeskScapes是一款动态壁纸的设置软件,安装确实是挺麻烦的,但 ...
- 【操作详解】在MapGIS 10中,如何实现矢量区和影像套合后,仅显示填充符号?
如需试用Mapgis产品,请访问司马云交易中心 知乎 - 安全中心www.smaryun.com/index.phpwww.smaryun.com/index.phpwww.smaryun.co ...
- 图文实战详解彻底关闭windows 10系统自带的windows defender的方法
微软发布了windows 10的版本更新win10 1903,相信很多喜欢尝鲜的小伙伴们都迫不及待的升级更新了,1903带来了新的功能和新的体验,比如登录界面毛玻璃效果,全新的windows主题,Co ...
- Redis详解和实战--云平台技术栈16
导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下其中的Redis! http://wdxtub.com/2016/07/05/redis-guide/ Redis 是 C 实现的基于内 ...
- 36进制与10进制之间的转换
import java.util.HashMap;/*** 36进制与10进制转换思路:* 一.创建HashMap类型对象用于存放数字'0'到字母'Z'36个字符值键对* 二.* @author Ad ...
- 高并发之并发容器详解
高并发之并发容器详解 一.vector Vector 是矢量队列,它是JDK1.0版本添加的类.继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口 ...
- ORB-SLAM2代码/流程详解
ORB-SLAM2代码详解 文章目录 ORB-SLAM2代码详解 1. ORB-SLAM2代码详解01_ORB-SLAM2代码运行流程 1 运行官方Demo 1.2. 阅读代码之前你应该知道的事情 1 ...
最新文章
- 清华计算机本硕博连读!中国籍袁昱博士当选2022年IEEE标准协会候任主席
- python怎么用excel-Python使用xlwt模块操作Excel的方法详解
- 【Flutter】JSON 模型转换 ( JSON 序列化工具 | JSON 手动序列化 | 根据 JSON 编写 Dart 模型类 | 在线自动根据 JSON 转换 Dart 类 )
- mysql 复制 二进制文件命令_Mysql中复制详细解析
- java .item,javabb-javaitem-cloud
- intel编译器_试试吧!用 Go 写一个即时编译器(JIT)
- 云图说 | 快速创建一个kubernetes集群
- 【java】画图和监听事件的应用
- 分享10款保护隐私的搜索引擎,快手动收藏!
- DirectoryEntry的使用
- 详谈AI芯片架构、分类和关键技术
- Python数据分析案例-消费者用户画像
- 互联网早报:微信内测深度清理功能内存,可一键清理缓存
- wei gwei ether之间的转换关系
- JAVA中的ZoneId常用值备注
- cnpm 新版本替换,及randomUUID is not a function问题解决
- java解压缩zip、rar
- 编程基础知识(变简单的进制转换)
- yoyo跑_yoyo主持人5岁女儿照片曝光 其老公魏哲浩个人资料简介
- 什么样的导航源码适合seo做收录的
热门文章
- 以太坊 Solidity 函数返回(returns)多个值 和 接收方式
- 共享锁 排他锁 是什么区别
- w ndows SE,2017《wndows可视化编程》在线作业附答案.docx
- python 递归目录和文件 修改主组_python下递归遍历目录和文件的方法介绍
- codeforces 并查集_codeforces 892E 可撤销并查集
- java blowfish ecb,node.js – 使用nodejs crypto和php的mcrypt解密blowfish-ecb
- java 线程中断的方法_Java中断线程的方法
- 七、面向对象三大特征(一)—— 封装
- Linux Centos firewall 防火墙 开启 80 端口配置案例
- PHPnow中ZendDebugger与ZendOptimizer 共存