你可能不知道的计算机基础
1、C 语言处理的数据形式
常量:在程序中不能改变其值的量
变量:在程序执行过程中可以改变其值的量(先定义后使用)
说明:变量名标识了内存中特定的一块内存单元(图一)。而内存是按字节进行编址的,并且是用唯一的一个十六进制无符号整数来标识地址(通常所说的变量的地址指的是变量的首地址)
比如 32 位机的内存地址是 32 位,从 0X00000000 到 0XFFFFFFFF
编译器按变量定义的类型分配相应大小的内存空间(图二)
2、高级语言为什么要区分数据类型?
更有效的组织数据,规范数据的使用
有助于提高数据的可读性,方便用户的使用
3、引入数据类型的好处?
数据类型可以明确告诉我们数据的取值范围,以及在该数据类型下可以进行哪些操作,这样可以防止许多不合法的错误
因为类型声明通常出现在程序可执行语句之前,所以编译器可以根据变量的类型来决定为变量分配多大的存储空间。这样在程序执行的时候,就有助于提高程序的执行效率、节省内存空间
4、变量类型决定了什么?
占用内存空间的大小
数据的存储形势
合法的取值范围
可参与的运算种类
5、宏常量
宏常量:用一个标识符号表示的常量
宏定义:#define 标识符 字符串
宏常量的值是不区分数据类型的,都会当做字符串处理,因为这是一个编译预处理指令,不是语句,所以后边无分号。以 #号开头,说明他是一个编译预处理指令
编译预处理指令:在源程序编译之前,先对程序中的编译预处理指令进行处理,然后将处理的结果和源程序一起进行编译,以得到目标代码
在预编译时,将程序中出现的宏名全部替换为对应字符串(宏替换)
如果在定义宏的时候,在后边加了分号
那么在预编译时进行宏替换,会把分号也替换进去。由于宏替换是不进行语法检查的,因此程序在编译的时候就会出现语法错误,因为在不该出现分号的时候出现了分号
编译器的主要任务之一就是对程序进行语法检查,但是编译预处理指令是在编译之前进行处理,它是不进行语法检查的,也就是说,宏替换时,是不进行语法检查的。因此,类似上边的那种语法错误,只有在对宏替换之后的源程序进行编译时,才会被发现
6、宏常量存在的问题
没有数据类型,编译器在进行宏替换时,不进行类型检查
只进行简单的字符串替换,容易产生意想不到的错误
7、const 常量
const 常量必须在定义的时候赋初值。因为编译器是将 const 常量放在只读存储区中
为什么要把 const 常量放只读存储区?
因为它是个常量,常量是不允许在程序中改变其值的,因此 const 常量只能在定义的时候赋初值
8、const 常量优点
有数据类型,编译器能对其进行类型检查
某些集成化调试工具可以对 const 常量进行调试
9、为什么计算机用二进制而不是十进制来存储数据?
二进制只有 0 和 1 两个,它的每一位都可以用电子元件来实现,且运算规则简单,相应的运算电路也容易实现
10、二进制是如何表示负数的?
用二进制的补码来表示的
比如这里来表示-1 的二进制(假设以 16 个数位来存储-1,左侧最高位是符号位,最高位为 1,则表示负数,除了符号位,其它位表示数值部分)
-1 的原码
对-1 的原码进行取反(除符号位)(取反就是 1 变成 0,0 变成 1)
-1 的反码
在反码的基础上进行加 1 处理,就得到补码
-1 的补码
这种有一位用来存储符号的就是有符号数,无符号数就是 16 全部用来存储数值
11、内存中是如何摆放数据的?
首先内存是一种存储单元的一维结构。通俗来说,内存就是一条单车道的马路,马路的宽度(也就是一维结构的宽度)就是 1 个字节,一个字节是 8 位,1 位就是二进制的一个 0 或 1
12、那么如何区分内存当中不同的位置?
方法就是给每个字节一个编号,也就是为每一个字节分配一个地址,通过这个地址就可以唯一的确定我需要访问的那个空间在内存当中的位置
13、什么是字和字长?
当我们查看自己电脑的基本信息的时候,会看见系统类型,比如是 32 位操作系统或 64 位操作系统
这个其实指的就是计算机的字和*字长*的概念
在计算机中,一串数码是作为一个整体来处理或运算的,称为一个计算机字,简称字(word)。计算机存储一个字所需的字节长度,称为字长(word size)(注意:计算机并不是一个一个取的,而是把一串数码当做一个整体取出。计算机一次处理的位数越多,那计算机的运算速度就越快)
14、求余运算
11%5 相信都知道是 1,那么
从上边可以看出来,余数的符号是和被除数的符号相同
15、求余运算的一个使用场景
将一个大范围的自然数集合映射到一个只有 N 个元素的小集合上
这个在哈希查找算法中可以用来构造哈希函数
还可以用它来生成指定范围内的随机数
C 语言提供的随机函数 rand()可以生成一个 0~32767 之间的随机数。如果我们希望生成的随机数范围在 1~100 的随机数,那么就可以通过求余来处理
这会生成一个 0~99 之间的数,那么再加 1,就会生成 1~100 的随机数。也就是
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/a169f149e894d2ef52cfce036】。文章转载请联系作者。
评论