`
ydbc
  • 浏览: 766806 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

【C语言】05-进制

 
阅读更多

一、十进制

1.概念

十进制是我们最熟悉、最常用的一种计数方式,它有两个特点:由0、1、2….9十个基本数字组成;运算规则是“逢十进一”。

2.运算

所谓“逢十进一”,似乎在小学数学中都已经学过了,也就是当数值满十时,就要向前进一位

个位数为9+1,满十了,十位数就进一。

二、二进制

1.概念

二进制是计算机内部使用的一种计数方式,它有两个特点:由0、1两个基本数字组成;运算规则是“逢二进一”。

2.细节

1> 有人可能会问:为什么二进制里面没有2~9这些数字呢?都说了,逢二进一,因此当数字满二的时候就会进位。

2> 如果我写个1010,你能看出它是二进制还是十进制么?为了跟其他进制区分开来,书写二进制数的时候,需要以0b或者0B开头。比如0b1010是个二进制数,而1010则还是我们熟悉的十进制数,就是“一千零一十”

3.运算

做个简单的运算吧,比如1+1

个位数是1+1,值满二了,于是十位数要进一。因此,在二进制中:1 + 1 =0b10,这里的0b10表示的是十进制中的“二”,并不是“十”。

以此类推,11 + 1 =0b100

4.二进制转为十进制

1> 用二进制表示数值,虽然简单、方便,但是不容易阅读,比如随便给出个二进制数0b110111101010,你能立刻看出它表示的是什么数值吗?一般需要将二进制数转为十进制数后才能知道代表的什么数值。

进制里面有个“基数”的概念,基数是用来计算数值的,比如十进制的基数是10,因此十进制是这样算数的:

1230 = 0 * 100+ 3 * 101+ 2 * 102+ 1 * 103= 0 * 1 + 3 * 10 + 2 * 100 + 1 * 1000

二进制的基数是2,以此类推:

0b1011 = 1 * 20+ 1 * 21+ 0 * 22+ 1 * 23= 1 * 1 + 1 * 2 + 0 * 4 + 1 * 8 = 1 + 2 + 0 + 8 = 11

因此二进制数0b1011表示的数值是十进制中的11

2> 一位二进制数能表示的最大值是1,而n位二进制数所能表示的最大值是0b111...1111,也就是说n位二进制数都是1,那么它的十进制数值为:

1 * 20+ 1 * 21+ 1 * 22+ 1 * 23+ .... + 1 * 2n-1= 2n- 1

因此,n位二进制数所能表示的最大值是2n- 1。也就是说,4位二进制数能表示的最大值是0b1111,十进制数值为:24- 1 = 15;5位二进制数能表示的最大值是25- 1 = 31。

三、八进制

1.概念

八进制有两个特点:由0~7八个基本数字组成;运算规则是“逢八进一”。

2.细节

由于十进制和八进制中都包含了0~7,为了区分开来,在书写八进制数的时候,需要在前面加个0。比如076是个八进制数,76则是个十进制数。

3.运算

个位数是7+1,值满八了,于是十位数要进一。因此,在八进制中,7 + 1 =010。010则表示十进制中的“八”,而不是“十”

4.八进制转十进制

八进制的基数是8,因此027计算出来就是十进制中的23

027 = 7 * 80+ 2 * 81= 7 * 1 + 2 * 8 = 23

5.二进制转八进制

不难发现一个十进制数可以表示的最大值是9,而一个八进制数可以表示的最大值是7,恰好3个二进制数可以表示的最大值0b111也是7。因此,我们可以用一个八进制数来代替3个二进制数。

0b11110011 =0b011 110 011 =0363

如果是八进制转为二进制,那就反过来,用3位二进制数来表示1位八进制数

025 =0b010 101=0b10101

四、十六进制

1.概念

十六进制有两个特点:由0~9和A~F组成,A~F分别表示10~15;运算规则是“逢十六进一”。

2.细节

由于十进制、八进制、十六进制中都包含了0~7,为了区分开来,在书写十六进制数的时候,需要在前面加个0x或者0X。比如0x76是个十六进制数,076是个八进制数,76则是个十进制数。

3.运算

个位数是B+5,也就是11+5,值满十六了,于是十位数要进一。因此,在十六进制中,B + 5 =0x10。0x10则表示十进制中的“十六”,而不是“十”

4.十六进制转十进制

十六进制的基数是16,F表示十进制中的15,因此0x2F计算出来就是十进制中的47

0x2F = 15 * 160+ 2 * 161= 15 * 1 + 2 * 16 = 47

5.二进制转十六进制

一个十六进制数可以表示的最大值是15,恰好4个二进制数可以表示的最大值0b1111也是15。因此,我们可以用一个十六进制数来代替4个二进制数。

0b11110011 =0b1111 0011 =0xF3

如果是十六进制转为二进制,那就反过来,用4位二进制数来表示1位十六进制数

0x25 =0b0010 0101=0b100101


五、进制总结

1.一个整数“十二”的4种表示方式分别如下:

十进制:12

二进制:0b1100

八进制:014

十六进制:0xC

2.其实也可以利用Mac中的计算器软件来测试进制之间的转换。

设置计算机的显示模式为“编程器”

先选择10进制,然后输入12,底部显示的二进制数为1100,这里省略最前面的0b

选择八进制,显示为14,这里省略了最前面的0

选择十六进制,显示为0xC

六、变量与进制

1.上一讲学习了变量的使用,简单回顾一下

1 int main()
2 {
3     int a = 10;
4     return 0;
5 }

在第3行定义了一个变量a,存储的是十进制整数10。其实,这个变量a在内存中是以二进制数的形式存储的,10的二进制形式是1010。

2.除了十进制整数,还可以将其他进制的整数赋值给整型变量

复制代码
 1 int main()
 2 {
 3     int a = 0b110; // 十进制数:6
 4     
 5     int b = 021; // 十进制数:17
 6     
 7     int c = 12; // 十进制数:12
 8     
 9     int d = 0x1D; // 十进制数:29
10     
11     return 0;
12 }
复制代码

上面的代码中,分别将4种不同进制的数值赋值给不同的整型变量。对应的十进制数值已经写在右边的注释中。它们最终都是以二进制的形式存储在内存中。

七、printf的简单使用

1.用printf输出整型变量

前面给变量赋值了各种进制的整数,究竟这些整数的十进制形式为多少呢?我们自己可以换算出来,不过总是自己去算,太麻烦了,我们可是程序员,应该利用程序帮我们算出来。前面已经学过printf("Hello World");语句的作用是在屏幕输出Hello World这一串内容。我们其实也可以利用printf将一个变量输出到屏幕,看看这个变量的值究竟为多少。

这个printf看起来好像是你往它的小括号里面放什么内容,它就会在屏幕上输出什么内容,但是printf的用法有讲究的,像下面的写法就是错误的:

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 0x1D;
 6     
 7     printf(a);
 8     
 9     return 0;
10 }
复制代码

有人可能会疑惑,为什么有时需要#include <stdio.h>,有时又不需要#include <stdio.h>?这个暂时不去详细讨论,你先记住只要用了printf,就要添加#include <stdio.h>。

在第5行定义了变量a,初值为一个十六进制数。在第7行想通过printf输出变量a的数值,但是第7行的写法是错误的。 要想利用printf输出一个整型变量,就必须先说明输出的格式,比如是以十进制格式输出还是以八进制格式输出?

下面的写法才是正确的:

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 0x1D;
 6     
 7     printf("变量a的值为%d", a);
 8     
 9     return 0;
10 }
复制代码

注意看第7行,左边双引号括住的内容代表着要输出到屏幕的内容,不过并不是直接将 "变量a的值为%d"输出到屏幕。%d是一种格式符,它的意思是用右边变量a的值替代%d的位置进行输出,并且以十进制格式输出。说白了,格式符是用来控制输出格式的。

程序在终端上的运行结果是:

可以发现,输出了"变量a的值为29",0x1D的十进制数值确实是29,说明这个输出是正确的。但是这个29跟后面的英文连在一起了,非常难看,这时候我们可以在%d的后面加一个\n表示回车换行。

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 0x1D;
 6     
 7     printf("变量a的值为%d\n", a);
 8     
 9     return 0;
10 }
复制代码

注意第5行的改变:在%d的后面加了个\n,表示将变量a以十进制格式输出后进行回车换行。

这时候的运行结果是:

这样就可以明显地看到这个29了

2.printf支持的格式符

除开%d,printf还支持很多格式符,如下表所示(红色表示常用),这份表格的内容不用去死记,用到时再回来查资料即可

接下来简单演示一下%x的使用,它的功能是以十六进制形式输出整数

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int a = 17;
 6     
 7     printf("%x\n", a);
 8     
 9     return 0;
10 }
复制代码

在第5行定义了变量a,存储的是十进制整数17,在第7行让变量a以十六进制形式输出,运行结果是:

可以发现,十进制整数17以十六进制形式输出就是11,这是正确的。

3.printf可以同时输出多个数值

看下面代码,利用printf同时输出多个数值

复制代码
 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     int age = 17;
 6     
 7     int no = 10;
 8     
 9     printf("age = %d, no = %d\n", age, no);
10     
11     return 0;
12 }
复制代码

注意看第9行,左边的双引号内有2个%d,age的值会代替第一个%d进行输出,no的值会代替第二个%d进行输出,并且都是以十进制形式输出。输出结果:

4.printf也可以输出常量

复制代码
1 #include <stdio.h>
2 
3 int main()
4 {
5     
6     printf("输出的常量为%d\n", 11);
7     
8     return 0;
9 }
复制代码

注意第6行,右边的是一个整型常量11,它会代替%d的位置进行输出。输出结果:

用了半天,似乎还是没有说到printf究竟是个什么东西,这个会放到后面详细讨论,它还有其他复杂用法。

分享到:
评论

相关推荐

    C语言-二进制文件转换十进制

    C语言-二进制文件转换十进制

    C语言-二进制文件转换16进制

    C语言-二进制文件转换16进制

    C语言,实现进制转换,十进制转换为十六进制

    C语言,实现进制转换,十进制转换为十六进制 例如输入10,转换结果为a

    C语言课设-进制转换器报告书 终极版.doc

    《C语言进制转换器程序设计详解》 在C语言编程中,进制转换是一项基础且重要的技能。本文将深入探讨如何使用C语言设计一个进制转换器,以实现不同进制之间的转换,包括二进制、八进制、十进制和十六进制,并进一步...

    完整word版-C语言课程设计-进制转换.doc

    "C语言课程设计:进制转换程序" 该课程设计报告的主题是使用C语言设计一个进制转换程序,实现二、八、十进制之间的转换。该设计报告共分为四章,分别是需求设计、程序设计、程序调试分析和用户手册。 第一章:需求...

    c语言中十六进制转二进制显示的实现方法

    代码如下://====================================== //输出格式: hex2bin 5e. //得到: 0101 1110 //====================================== #include &lt;stdio&gt;#include char *bitstr(char *, void const *, size_t...

    c语言实现八进制转十进制

    本篇将深入探讨如何使用C语言实现八进制(Octal)到十进制(Decimal)的转换,以及提供的程序源代码的解析。 首先,我们要理解八进制和十进制的基本概念。八进制系统基于8,它的数字范围是0-7,而十进制系统基于10...

    C语言-顺序栈实现十进制转换为二进制-八进制-十六进制

    ### C语言顺序栈实现十进制到二进制、八进制、十六进制的转换 #### 一、概述 本篇文章将详细介绍如何使用C语言中的顺序栈来实现十进制数字向二进制、八进制以及十六进制的转换。通过分析给出的代码示例,我们将...

    C语言进制转换,十进制转16进制

    在编程领域,进制转换是一项基础且重要的技能,特别是在C语言中。C语言不内置直接进行进制转换的函数,因此程序员需要通过自定义函数来完成。本篇将深入探讨如何在C语言中实现十进制到十六进制的转换。 首先,我们...

    C语言实现十进制转换成二八十六进制

    C语言实现十进制转换成二八十六进制的转换,代码已经经过调试可以使用,放心下载!

    C语言写的进制转换系统

    本项目“C语言写的进制转换系统”便是一个利用C语言实现的实用工具,它允许用户在二进制、八进制、十进制和十六进制之间进行方便的转换。下面将详细解析这个系统的实现原理和相关知识点。 首先,进制转换是计算机...

    C语言文件二进制取反

    C语言文件二进制取反。使用fread和fwrite。可以处理任意文件。

    C语言数据结构栈应用-进制转换

    该源码 详细说明了c语言中 顺序栈在进制转换上的应用

    C语言课程设计进制转换

    本文将深入探讨“C语言课程设计进制转换”的主题,旨在帮助你理解不同进制之间转换的基本原理以及如何用C语言实现这些转换。 首先,我们要了解进制的概念。进制是一种数字系统,它定义了数字的表示方式。常见的进制...

    C语言实现十进制向任意进制转换

    C语言实现十进制向任意进制转换代码,已经经过调试无问题。可以直接使用

    任意文件转C语言数组 二进制BIN文件、图片转数组

    标题“任意文件转C语言数组 二进制BIN文件、图片转数组”所指的就是这个过程,即将非文本格式的数据(如二进制文件、图片)转换为C语言的字符数组形式,以便于在C代码中直接使用。这样的操作对于单片机编程尤其有用...

    C语言实现二进制转换十进制

    C语言实现二进制转换十进制 在计算机科学中,二进制转换十进制是非常重要的一种数据转换方式。本文将介绍如何使用 C 语言实现二进制转换十进制,并提供了详细的代码说明和源代码。 首先,让我们了解二进制转换十...

    C语言16进制转换浮点数

    计算机通讯协议中,会遇到返回信息中,4个整型数字组合代表一个浮点数,本案例是通过位运算将4个整型组合转化成浮点数。

    C语言实现十进制转十六进制

    本篇文章将深入探讨如何使用C语言将十进制数值转换为十六进制。C语言是一种底层编程语言,提供了丰富的库函数和控制结构,使得进行这样的转换变得简单而高效。 首先,我们要理解十进制和十六进制的基本概念。十进制...

    C语言的各类进制转换

    C语言提供了多种方法来实现这些进制之间的转换。本篇文章将深入探讨C语言中的进制转换技术。 一、进制系统简介 1. **二进制(Binary)**:二进制系统只有两个数字,0 和 1,它是所有计算机运算的基础。 2. **八...

Global site tag (gtag.js) - Google Analytics