详解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 * 16+ 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';
              else
                    buf[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进制的表示能力最强。

时间: 2024-10-05 23:26:47

详解2进制,10进制,16进制,8进制,36进制的相关文章

【转】DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10

[转]DBMS_STATS.GATHER_TABLE_STATS详解 2012-04-22 09:20:10 分类: Linux 由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至关重要! 作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信息收集,包含该表的自身-表的行数.数据块数.行长等信息:列的分析--列值的重复数.列上的空值.数据在列上的分布情况:索引的分析-索引页块的数量.索引的深度.索引聚合因子)

流量主第六篇:006_详解:粉丝过10万的公众号就可成为流量主!

本定于上周五(7月4日)公测的广点通,由于还有部分小问题,拖到了今天开放,一时间各大微信运营者的群炸开了锅,大家一般围绕这几个问题展开:www.heerqq.com/ 1.在公测期间,只有粉丝数过10万的公众帐号才可成为流量主,无需认证,就可提供广告展示,获取收入对于那些不够10万,需要10万粉丝的朋友 微赢提供 一揽子10万粉丝 解决方案QQ 2663223060 因为上一次官方公布条件的时,规定的粉丝数是500个以上就可以开通(未微信认证的政府类型暂不支持开通流量主功能),但是这次又出台了1

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

ARP缓存表的构成ARP协议全面实战协议详解、攻击与防御

ARP缓存表的构成ARP协议全面实战协议详解.攻击与防御 1.4.3  ARP缓存表的构成 在局域网的任何一台主机中,都有一个ARP缓存表.该缓存表中保存中多个ARP条目.每个ARP条目都是由一个IP地址和一个对应的MAC地址组成.这样多个ARP条目就组成了一个ARP缓存表.当某台主机向局域网中另外的主机发送数据的时候,会根据ARP缓存表里的对应关系进行发送本文选自ARP协议全面实战手册——协议详解.攻击与防御. 1.查看ARP缓存记录本文选自ARP协议全面实战手册——协议详解.攻击与防御 [实

Java I/O : Java中的进制详解

作者:李强强 上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算.这一讲,泥瓦匠带你走进Java中的进制详解. 一.引子 在Java世界里,99%的工作都是处理这高层.那么二进制,字节码这些会在哪里用到呢? 自问自答:在跨平台的时候,就凸显神功了.比如说文件读写,数据通信,还有Java编译后的字节码文件.下面会有个数据通信的例子哦. Java对对象实现Serializablle接口,就可以将其转化为一系列字节,而在通信中,不必要关系数据如何在不同机器表示和字节的顺

ORACLE 36进制和10进制,互相转换函数

第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int  is returnValue int;   str36     varchar(36);   subWork   varchar(1);   workIndex   int;   len     int;   i       int; begin returnValue:= 0;   str36 := '123456789ABCDEFGHIJK

10进制正整数转4位定长的36进制字符串

题目描述: 请设计一个函数可以把10进制的正整数转换为4位定长的36进制字符串. 36进制的规则为:“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”; 举例说明: 1=“0001” 10=“000A” 20=“000K” 35=“000Z” 36=“0010” 100=“002S” 2000=“01JK” 这是腾讯2015校园招聘技术类研发笔试题中的一题,给出自己的答案,欢迎拍砖. solution: string convert(int x) { string re

详细解释2进制,10进制,16进制,8进制,36进制

本篇介绍C/C++语言中的进制的概念,主要介绍2进制.10进制.16进制,这三种是编程时必须掌握的也是最常用的.另外,介绍8进制和36进制,其中 36进制在实际工程项目中会遇到. (本文选自<C/C++学习指南>,邵发,附录"2进制,10进制,16进制") 权利声明:作者拥有本书的全部权利.作者授权任何人都可以自由转载本网站发布的内容,但转载时必须遵守以下限制: ①转载时必须全文转载,不得有任何修改,必须包含"权利声明"和"官网地址"