C语言基础概念
原码,反码和补码
数据在C语言是以二进制的方式存储。因为二进制的加减运算问题。数据存储为补码。反码是原码逐一取反,补码为反码+1。
进制中小数的转换
十进制小数转换成 N 进制小数采用“乘 N 取整,顺序排列”法。具体做法是:
用 N 乘以十进制小数,可以得到一个积,这个积包含了整数部分和小数部分;
将积的整数部分取出,再用 N 乘以余下的小数部分,又得到一个新的积;
再将积的整数部分取出,继续用 N 乘以余下的小数部分;
……
如此反复进行,每次都取出整数部分,用 N 接着乘以小数部分,直到积中的小数部分为 0,或者达到所要求
的精度为止。
十进制小数 0.6875 转换成二进制小数的结果为 0.1011。
虚拟内存
当程序运行需要的空间大于内存容量时,会将内存中暂时不用的数据再写回硬盘;需要这些数据时再从硬盘中读取,并将另外一部分不用的数据写入硬盘。这样,硬盘中就会有一部分空间用来存放内存中暂时不用的数据。这一部分空间就叫做虚拟内存(Virtual Memory) 。
ASCII 编码
用固定的二进制数表示固定的字符。各国字符集在ASCII基础上扩展,原来 ASCII 中已经包含的字符,在国家编码(地区编码)中的位置不变(也就是编码值不变),只是在这些字符的后面增添了新的字符。
编码方案
UTF-8:一种变长的编码方案,使用 1~6 个字节来存储;
如果只有一个字节, 那么最高的比特位为 0,这样可以兼容 ASCII;
如果有多个字节,那么第一个字节从最高位开始,连续有几个比特位的值为 1,就使用几个字节编码,剩下的
字节均以 10 开头。
UTF-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
特点:空间换效率
UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
全角和半角输入法的区别
在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为“半角”,相对地把一个汉字所占的位置称为“全角”。
“相同”字符在全角和半角状态下对应的编码值(例如 Unicode 编码、 GBK 编码等)不一样,所以它们是不同的字符。
C语言程序的执行
先把代码编译(转换成二进制),再链接(“打包”将所有二进制形式的目标文件和系统组件组合成一个可执行文件 )。最后生成可执行文件。
整形的长度
C 语言并没有严格规定 short、 int、 long 的长度,只做了宽泛的限制:
short 至少占用 2 个字节。
int 建议为一个机器字长。 32 位环境下机器字长为 4 字节, 64 位环境下机器字长为 8 字节。
short 的长度不能大于 int, long 的长度不能小于 int。
获取某个数据类型的长度可以使用 sizeof 操作符
进制的表示
转义字符
转义字符以\或者\x 开头,以\开头表示后跟八进制形式的编码值,以\x 开头表示后跟十六进制形式的编码值。 对于
转义字符来说,只能使用八进制或者十六进制。
1 |
|
输出结果为“123abc”
加减乘除的优先性
和数学上的优先级相同。如果符号的优先级相同,则更具结合性判断。先执行左边的叫左结合性,先执行右边的叫右结合性。
对取余运算的说明
余数可以是正数也可以是负数,由 % 左边的整数决定:
如果 % 左边是正数,那么余数也是正数;
如果 % 左边是负数,那么余数也是负数
printf() 的高级用法
printf() 格式控制符的完整形式如下:
1 | %[flag][width][.precision]type |
[ ] 表示此处的内容可有可无,是可以省略的。
type 表示输出类型,比如 %d、 %f、 %c、 %lf, type 就分别对应 d、 f、 c、 lf;再如, %-9d 中 type 对应 d。
type 这一项必须有,这意味着输出时必须要知道是什么类型。
width 表示最小输出宽度,也就是至少占用几个字符的位置;例如, %-9d 中 width 对应 9,表示输出结果最少
占用 9 个字符的宽度。
当输出结果的宽度不足 width 时,以空格补齐(如果没有指定对齐方式,默认会在左边补齐空格);当输出结果的
宽度超过 width 时, width 不再起作用,按照数据本身的宽度来输出。
缓存区
缓冲区位于用户程序和硬件设备之间,用来缓存数据,目的是让快速的 CPU 不必等待慢速的输入输出设备,同时减少操作硬件的次数。对于 IO 密集型的网络应用程序,比如网站、数据库、 DNS、 CDN 等,缓冲区的设计至关重要,它能十倍甚至一百倍得提高程序性能。
scanf()控制字符串
1 | %{*} {width} type |
其中, { } 表示可有可无。各个部分的具体含义是:
type 表示读取什么类型的数据,例如 %d、 %s、 %[a-z]、 %[^\n] 等; type 必须有。
width 表示最大读取宽度,可有可无。
*表示丢弃读取到的数据,可有可无。