第3章 数据和 C
这是在读本书时,遇到的第一章满满的干货(🤪可能后边每一章都是这样),看到一半甚至都想草草看完简单做点笔记结束,但是想到自己学习 C语言的目地是为了阅读 redis的源码。在 redis中,对于数据的存储时类型的选择,非常的高效、紧凑,学完这一章,可以有更扎实的理解,因此还是仔细看了 2 遍,然后才动手写的笔记。
本章介绍了 C语言中的基础数据类型,内容比较细致。
C语言种数据类型的关键字
K&R给出的关键字 | C90添加的 | C99添加的 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
不同进制下的数字输出
10进制 | 8进制 | 16进制 | |
---|---|---|---|
前缀符号 | 0 | 0x或0X | |
不带符号输出 | %d | %o | %x |
带符号输出 | %#o | %#x |
后缀
long | long long | unsigned | |
---|---|---|---|
后缀 | l或者L | ll或者LL | u或者U,与long一块可以组成 lu,ul,UL等 |
整型
在不同的机器上,相同的整数类型占用的位数可能不同。C标准只规定了不同数据类型允许的最小大小:
类型 | 最小范围 | 备注 |
---|---|---|
short、int | 32767~32767 | 3万 |
long | -2147483648~2147483648 | 21亿 |
unsigned short,unsigned int | 0-65535 | 6万 |
unsigned long | 0~4294967295 | 42亿 |
long long | 9后边18位数字(9百亿亿) | |
unsigned long long | 18后边18位数字 |
打印不同类型的数字
类型 | 转换方式 |
---|---|
short | %h |
int | %d |
unsigned int | %u |
long | %ld |
long long | %lld |
unsigned long | %llu |
char
在C语言中,用单引号括起来的单个字符被称为字符常量(char),双引号括起来的为字符串。在系统层面char是整数类型,char类型实际存储的为整数而不是字符。在有的编译器中将char实现为有符号类型,有的编译器种实现为无符号类型。C90开始,可以使用signed、unsigned来修饰char.
以下是一个打印char变量两种方式的示例:
char ch;
ch = 'A';
printf("The code for %c is %d.\n",ch,ch)
_Bool(C99)
布尔类型,即true,false。内部也是一种整数类型,只占用1位存储空间。
可移植类型:stdin.h和inttypes.h(C99)
因为C语言中部分类型在不同系统中的功能不一样,因此C99增加了一些类型,以确保C语言的类型在各个系统中的功能相同。
意思 | 示例 | |
---|---|---|
精确宽度类型 | 方便统一在不同位数的操作系统中的数据类型长度 | int32_t |
最小宽度类型 | 当计算机底层系统不支持精确宽度类型时使用 | int_least8_t |
最快最小宽度类型 | 当更关心速度而非空间时使用 | int_fast8_t |
最大整型 | 系统的最大整数类型 | intmax_t 有符号整数类型 uintmax_t 无符号整数类型 |
总结:
浮点数:分为float、double、long double。c语言中的浮点数包括数字部分和整数部分,可以省略其中一个。浮点数存在上溢(超出可表示类型的最大数)和下溢(超出可表示的最大精度,导致部分小数丢失)的情况。
复数和虚数:C99开始支持,C11将整个复数软件包作为可选项。
类型的大小:使用sizeof可以查看指定类型的大小,用%zd输出
使用数据类型:初始化变量时,应使用与变量类型相符的常数类型。在定义变量名时,可以在变量名中体现其类型,比如 i_、us_ 前缀。
参数与陷阱:printf()、scanf()支持多个参数的传入,如果传入错误数量的参数,编译器可能会捕获不到对应的错误。
刷新输出:printf()会将输出发送到缓冲区。当从缓冲区显示到屏幕或者发送到文件时成为刷新缓冲区。c标准规定的刷新缓冲区的时机:缓冲区满、遇到换行字符、需要输入时。使用ffflush() 也可以刷新缓冲区。
在本章中,对于存储单位的理解比较吃力,在查阅的一些资料后,发现可能是因为对cpu、操作系统的了解不够,导致的。
在本章的学习过程中,因为工作原因,有近一个月的时间需要加班到比较晚。极大的影响到了学习进度。同时发现,想将笔记做好,需要花费的精力是学完的好几倍,因此决定本次重学C语言,只在每章学习完后,进行一个比较简单的学习总结。来提高学习效率,争取1月底看完本书。