上一讲简单介绍了常量和变量,这讲补充一点计算机的基础知识---进制。

我们先来看看平时是如何表示一个整数的,最常见的肯定是用阿拉伯数字表示,比如“十二”,我们可以用12来表示,其实这种表示方式是基于一种叫做“十进制”的计数方式。“进制”是一种计数方式,编程中常见的进制有4种:十进制、二进制、八进制、十六进制。也就是说,同一个整数,我们至少有4种表示方式。

一、十进制

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 * 10= 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 * 2+ .... + 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 = 0b 011  110  011  = 0363

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

025 = 0b 010  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 = 0b 1111  0011  = 0xF3

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

0x25 = 0b 0010  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究竟是个什么东西,这个会放到后面详细讨论,它还有其他复杂用法。

【零基础学习iOS开发】【02-C语言】05-进制的更多相关文章

  1. 李洪强iOS开发之零基础学习iOS开发【02-C语言】03-关键字、标识符、注释

    上一讲中已经创建了第一个C语言程序,知道了C程序是由函数构成的,这讲继续学习C语言的一些基本语法.C语言属于一门高级语言,其实,所有的高级语言的基本语法组成部分都是一样的,只是表现形式不太一样.就好像 ...

  2. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

  3. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...

  4. 【零基础学习iOS开发】【01-前言】01-开篇

    本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开发 四.学习iOS开发的目的 五.学习iOS开发的前提 从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过I ...

  5. 零基础学习iOS开发

    零基础学习iOS开发不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍了函数的定义和使 ...

  6. [iOS]关于零基础学习iOS开发的学习方法总结

    关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...

  7. 李洪强iOS开发之【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

    前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法.学习任何一门语言,首先要掌握的肯定是语法.学习C语言语法的目的:就是能够利用C语言编写程序,然后运行程序跟硬件(计算 ...

  8. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】02-准备

    在上一讲中,介绍了什么是iOS开发.说简单一点,iOS开发,就是开发运行在iPhone或者iPad上的软件.这么一说完,应该有很多人就会产生一些疑惑,比如学习iOS开发是不是一定要买iPhone?需不 ...

  9. 【零基础学习iOS开发】【01-前言】02-准备

    一.程序设计语言 上一讲已经说到:要想开发一款软件,首先得学习一些对应的程序设计语言. 至于iOS开发,须要学习的语言主要有:C.C++.Objective-C. 回到顶部 二.是否须要计算机专业知识 ...

  10. 李洪强iOS开发之零基础学习iOS开发】【02-C语言】01-概述

    前面已经给大家介绍了iOS开发相关的一些基础知识,其实iOS开发就是开发iPhone\iPad上的软件,而要想开发一款软件,首先要学习程序设计语言.iOS开发需要学习的主要程序设计语言有:C语言.C+ ...

随机推荐

  1. 封装cookie

    function cookie(name,value,expires){ switch(typeof value){ case 'string': //设置 var exp=''; if(expire ...

  2. IOS_问题: Xcode8 安装KSImageName插件, 编代码就崩了

    Xcode 8之后, KSImageName插件就不能用了,如果安装了,就会导致一写英文代码Xcode 就崩了. 解决方法: 把这个插件删除,重启了一下xcode就可以了, 如果重启没用, 可以尝试下 ...

  3. Sqlite: unable to open database file

    A database connect, there updated both queries (different statement, and regardless of order), after ...

  4. SVN四部曲之SVN命令精通

    SVN 常用命令一览表 命令 功能 使用格式 checkout 检出 svn  co  URL up 更新到当前URL的末端 svn  up switch 更新到某一tag/branch svn  s ...

  5. 团队项目之NABC

    Time:2013-10-22 Author:wang 一个成功的人,总是知道如何管理自己的时间,如何让自己的时间得到最充分最有效的利用.对学生一族而言,课业负担重,各种课程.各种活动.各种社团,如果 ...

  6. eclipse不能创建java虚拟机-解决方法

    找到eclipse目录下的eclipse.ini,可以看到如下内容: -startup plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar ...

  7. Could not find file '..\bin\hibernate.cfg.xml'解决方法:

    web.config: 解决方法:

  8. boost::bind

    bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定的参数个数和要绑定的调用对象类型,总共有十个不同的形式,但它们的名字都叫bind. bind接受的第一个参数必须是一个可调用对象f,包括函 ...

  9. ETL Pentaho Data Integration (Kettle) 插入/更新 问题 etl

    Pentaho Data Integration (Kettle) 使用此工具 按 索引  做 插入更新操作时,也可能报 索引重复 的错误, 解决方法:  匹配的索引字段可能有null值,会导致此错误 ...

  10. 文本编辑器 markdown

    http://www.cnblogs.com/youxia/p/linux014.html markdown对数学公式的支持http://www.linuxidc.com/Linux/2014-08/ ...