【零基础学习iOS开发】【02-C语言】05-进制
上一讲简单介绍了常量和变量,这讲补充一点计算机的基础知识---进制。
我们先来看看平时是如何表示一个整数的,最常见的肯定是用阿拉伯数字表示,比如“十二”,我们可以用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 * 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 = 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究竟是个什么东西,这个会放到后面详细讨论,它还有其他复杂用法。
转载于:https://www.cnblogs.com/mjios/archive/2013/05/24/3067219.html
【零基础学习iOS开发】【02-C语言】05-进制相关推荐
- [iOS]关于零基础学习iOS开发的学习方法总结
关于零基础学习iOS开发的学习方法总结 最近很多零基础来参加蓝鸥培训的学生经常会问到一些学习方法的问题,就如下我自己见过的好的学习方法一起讨论一下. 蓝鸥iOS开发技术的学习路线图 程序员的主要工作是 ...
- 随笔分类 - 零基础学习iOS开发
随笔分类 - 零基础学习iOS开发 不管你是否涉足过IT领域,只要你对iOS开发感兴趣,都可以阅读此专题. [零基础学习iOS开发][02-C语言]11-函数的声明和定义 摘要: 在上一讲中,简单介绍 ...
- 零基础学习 iOS 开发
作者:匿名用户 链接:https://www.zhihu.com/question/22000647/answer/114700565 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- 【零基础学习iOS开发】【02-C语言】10-函数
一.基本概念 1.什么是函数 不论什么一个C语言程序都是由一个或者多个程序段(小程序)构成的.每一个程序段都有自己的功能,我们一般称这些程序段为"函数". 所以.你能够说C语言程序 ...
- 【零基础学习iOS开发】【01-前言】03-前景和难易度分析
本文目录 一.iOS开发的前景 二.iOS开发的难易度 这讲继续介绍iOS初学者比较感兴趣的问题:iOS开发的前景如何.iOS开发的难易度.要想分析iOS开发的前景,首先你要搞清楚是哪个牛X公司在维护 ...
- 【零基础学习iOS开发】【02-C语言】08-基本运算
计算机的基本能力就是计算,所以一门程序设计语言的计算能力是非常重要的.C语言之所以无所不能,是因为它不仅有丰富的数据类型,还有强大的计算能力.C语言一共有34种运算符,包括了常见的加减乘除运算.这讲就 ...
- 黑马程序员——零基础学习iOS开发——13 Foundation框架
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- 零基础学习IOS开发(二)- 使用cocos2d-x3.0 执行Hello world
关于开发框架,依据网上检索来的信息,感觉cocos2d-x的ios游戏开发框架非常不错,并且有非常强的可移植性,因此打算尝试一下. 截止写下此文章,最新的cocos2d-x的版本号为v3.0稳定版(几 ...
- 零基础学python需要多久-零基础学习Python开发需要多长时间?
原标题:零基础学习Python开发需要多长时间? Python开发技术目前可谓是互联网行业编程界的新宠,不少零基础想要进入IT行业的人员都纷纷加入学习Python开发.零基础学习Python开发技术需 ...
最新文章
- Windows下使用gvim
- Android面向切面编程框架(AspectJ 讲解)
- K8S水平伸缩器 - 自动伸缩微服务实例数量
- 基于PyMC的贝叶斯建模实战
- GitHub Trending第一之后,PaddleOCR再发大招:百度自研顶会SOTA算法正式开源!
- STM32,你了解多少?(转载)
- Ubuntu上面安装Mongo
- smartdns使用指南_SmartDNS配合某插件进阶上网使用教程(基于N1盒子Op系统)
- paip.java桌面开发应用与WEB RIA应用
- WES分析1-外显子测序
- Java IO流基础
- (翻译)用户友好的表格的9种设计技巧
- 计算机打数据执行保护删除不掉,XP老是出现“数据执行保护”怎么办?教你方法轻松解决此问题...
- 2020年12月电子学会青少年软件编程Scratch(二级)等级考试真题解析
- Axure RP 8.1.6授权码
- Python re模块 —— 从零基础开始入门正则表达式
- 水星usb无线网卡MW150US驱动 for Mac
- 日历记事本java_日历记事本-JAVA课程设计..
- layui 点击保存延迟几秒跳转页面
- 伊利洛伊大学厄巴纳-香槟分校计算机专业,伊利诺伊大学香槟分校人工智能系排名必须得慎重来看...
热门文章
- [react] 解释下react中component和pureComponent两者的区别是什么?
- 13攻击行为是天生的
- [vue] 如果将axios异步请求同步化处理?
- [css] 说说响应式设计(responsive design)和自适应设计(adaptive design)的区别?
- 前端学习(2793):完成联系我们页面和地图
- 工作126:Vue.ls.set传值 然后取值
- “约见”面试官系列之常见面试题第二十四篇之vue-router使用(建议收藏)
- 前端学习(2144):webpack中使用css的配置
- 前端学习(1810):前端调试之css装饰cursor
- java学习(19):巩固练习