【《C Primer Plus》读书笔记】第3章:数据和C
3.1 C语言 关键字
C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

数据类型关键字(12个):
| 关键字 | 说明 |
|---|---|
| int | 整形变量 |
| long | 长整数型变量 |
| short | 短整数型变量 |
| unsigned | 无符号类型变量 |
| char | 单字节整型变量或字符 |
| float | 单精度浮点数 |
| double | 双精度浮点数 |
| signed | 有符号类型变量 |
| void | 无类型变量 |
| _Bool | 布尔值 |
| _Complex | 复数 |
| _Imaginary | 虚数 |
C语言中常见的数据类型:
| 关键字 | 数据类型 | 字节长度(16位系统) | 字节长度(32位系统) | 字节长度(64位系统) |
|---|---|---|---|---|
| bool | 布尔型数 | 1 | 1 | 1 |
| char | 单字节整型数或字符型数据 | 1 | 1 | 1 |
| unsigned char | 无符号单字节整型数或字符型数据 | 1 | 1 | 1 |
| short | 短整型数 | 2 | 2 | 2 |
| int | 整型数 | 2 | 4 | 4 |
| unsigned int | 无符号整型数 | 2 | 4 | 4 |
| long | 长整型数 | 4 | 4 | 8 |
| unsigned long | 长整型数 | 4 | 4 | 8 |
| long long | 长长整型数 | 8 | 8 | 8 |
| float | 单精度型浮点数 | 4 | 4 | 4 |
| double | 双精度型浮点数 | 8 | 8 | 8 |
| long double | 长双精度型浮点数 | 16 | 16 | |
| * | 指针 | 2 | 4 | 8 |
控制语句关键字(12个):
| 关键字 | 说明 |
|---|---|
| for | for循环结构 |
| do | do循环结构 |
| while | while循环结构 |
| break | 跳出当前循环 |
| continue | 结束当前循环,开始下一轮循环 |
| if | 条件语句 |
| else | 条件语句否定分支 |
| goto | 跳转语句 |
| switch | 开关语句(多重分支语句) |
| case | 开关语句中的分支标记 |
| default | 开关语句中的“其他”分支可选 |
| return | 返回语句 |
存储类型关键字(4个):
| 关键字 | 说明 |
|---|---|
| auto | 声明自动变量 |
| exturn | 声明外部变量 |
| register | 声明寄存器变量 |
| static | 声明静态变量 |
其它关键字(4个):
| 关键字 | 说明 |
|---|---|
| const | 声明只读变量(不可更改的常量值) |
| sizeof | 得到特定类型或特定类型、变量的大小 |
| typedef | 声明类型别名 |
| volatile | 声明变量在程序执行中可被隐含地改变 |
3.2 位、字节、字
位、字节、字是描述计算机数据单元或存储单元的术语。
位是计算机内存的基础构建块,单位为 bit ,可以存储0或1。
字节是常见的计算机存储单位,单位为 byte ,1 B=8 Bit
字(word)是设计计算机时给定的自然存储单位,可以是8位,16位,32位,64位。
3.3 机械字长、指令字长、存储字长
机器字长:是指计算机能直接处理的二进制数据的位数,决定了计算机的运算精度。
指令字长:一个指令字中包含二进制代码的位数。
存储字长:一个存储单元存储一串二进制代码,这串二进制代码的位数称为存储字长,存储字长可以是8位、16位、32位等。
机器字长反映了计算机的运算精度,即字长越长,数的表示范围也越大,精度也越高。机器的字长也会影响机器的运算速度。倘若CPU字长较短,又要运算位数较多的数据,那么需要经过两次或多次的运算才能完成,这样势必影响整机的运行速度。
机器字长与主存储器字长通常是相同的,但也可以不同。不同的情况下,一般是主存储器字长小于机器字长,例如机器字长是32位,主存储器字长可以是32位,也可以是16位,当然,两者都会影响CPU的工作效率。
3.4 转义序列
转义序列用于在字符串字面量和字符常量中表示某些特殊字符。
| 转义序列 | 含义 |
|---|---|
| \a | 报警(ANSIC) |
| \b | 退格 |
| \f | 换页 |
| \n | 换行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \\ | 反斜杠 (\) |
| \’ | 单引号 |
| \ " | 双引号 |
| \0oo(或\nnn) | 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数) |
| \xhh | 十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数 |
相关链接:
转义序列
示例:
/* escape.c -- 使用转义序列*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
float salary;
printf("\aEnter your desired monthly salary:");
printf(" $_______\b\b\b\b\b\b\b");
scanf("%f", &salary);
printf("\n\t$%.2f a month is $%.2f a year.", salary, salary * 12.0);
printf("\rGee!\n");
system("pause");
return 0;
}
运行程序,首先发出一声警报(因为使用了\a)。

退格符\b 使得光标移至7个下划线字符的前面,紧跟在 $ 后面。
输入4000.00

按下Enter键

\n\t 使光标移至下一行的下一个制表点(一般是第9列,但不一定),打印 $4000.00 a month is $48000.00 a year.
\r 使光标移至同一行的起始处,打印Gee!
3.5 转换说明
| 转换说明 | 含义 |
|---|---|
| %d (或%i) | 带符号的十进制形式整数(int) |
| %h | 短整型数(short) |
| %u | 无符号数(unsigned) |
| %f | 小数点形式的单精度实数,浮点数,十进制记数法(默认小数点后6位) (float) |
| %lf | 小数点形式的双精度实数,浮点数,十进制记数法(默认小数点后6位) (double) |
| %ld | 有符号长整型数格式(long) |
| %lo | 以八进制打印long类型整数 |
| %lx | 以十六进制打印long类型整数 |
| %e %E | 标准指数形式的单、双精度实数,浮点数,e记数法 |
| %a | 十六进制浮点数 |
| %o | 无符号的八进制形式整数 |
| %x %X | 无符号的十六进制形式整数 |
| %#o | 带前缀0的八进制数 |
| %#x | 带前缀0x的十六进制数 |
| %#X | 带前缀0X的十六进制数 |
| %c | 字符 (char) |
| %s | 字符串 (char[ ]) |
| %p | 指针(地址) (*p) |
| %g | 选用宽度较小的格式输出实数,自动选择合适的表示方法 |
| %% | 打印 % |
示例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
//%d
int a = 74;
printf("%d ", 2);
printf("%d ", -5);
printf("%d ", a);
printf("\n");
//%i
int b = -23;
printf("%i ", 232);
printf("%i ", -56);
printf("%i ", b);
printf("\n");
//%u
unsigned c = 231;
printf("%u ", 21);
printf("%u ", 34);
printf("%u ", c);
printf("\n");
//%f
float d = -66.78;
printf("%f ", 21.23);
printf("%f ", -34.00);
printf("%f ", d);
printf("\n");
//%lf
double e = -66.78;
printf("%lf ", 21.23);
printf("%lf ", -34.00);
printf("%lf ", e);
printf("\n");
//%e %E
double f = -352923.4;
float g = 34.672;
printf("%e ", 212.31);
printf("%E ", -34121.00);
printf("%e ", f);
printf("%E ", g);
printf("\n");
//%o
int h = 742;
printf("%o ", 0);
printf("%o ", 1235);
printf("%o ", h);
printf("\n");
//%x %X
int i = 3529;
int j = 34275;
printf("%x ", 211);
printf("%X ", 9312);
printf("%x ", i);
printf("%X ", j);
printf("\n");
//%c
char k = 'a';
printf("%c ", 's');
printf("%c ", k);
//%s
char m[] = "Thanks";
printf("%s ", "Tom");
printf("%s ", "hello");
printf("%s ", m);
printf("\n");
//%p
int *n;
n = &a;
printf("%p ", &a);
printf("%p ", n);
printf("\n");
//%g
double o = 5634.96;
float p = 6.234;
printf("%g ", 13131.63523);
printf("%g ", o);
printf("%g ", p);
printf("\n");
//%%
printf("%%");
printf("\n");
system("pause");
return 0;
}

浮点数舍入错误
浮点值的上溢与下溢。
上溢时,赋一个表示无穷大的特定值;下溢时,尾数右移,阶码+1,丢弃尾数的最低位,导致丢失精度。
程序:
/* floaterr.c -- 演示舍入错误*/
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float a, b;
b = 2.0e20 + 1.0;
a = b - 2.0e20;
printf("%f\n", a);
system("pause");
return 0;
}
结果:

按理来说应该是1.0,出现错误的原因是计算机缺少足够的小数位来完成正确的计算。
3.6 定点数的表示
在计算机参与运算的机器数分为:
- 无符号数:整个机器字长的二进制位都是数值位
- 有符号数:二进制数的最高位是符号位,其余为数值位
3.6.1 定点小数
定点小数是纯小数,约定:小数点位置在符号位之后,有效数值部分最高位之前。

3.6.2 定点整数
定点整数是纯整数,约定:小数点位置有效数值部分最低位之后。

3.7 浮点数的表示

3.7.1 规格化
通过调整一个非规格化浮点数的尾数和阶码的大小,使非零的浮点数在尾数的最高数位上保证是一个有效值。
左规:当运算结果为非规格化时,尾数算数左移一位,阶码减1
右规:当运算结果尾数出现溢出时,尾数算数右移一位,阶码加1
左规可能要进行多次, 右规只需进行一次

3.7.2 IEEE 754 标准
IEEE 754 标准的浮点数,尾数采用隐藏位策略(最高位总是1,且隐藏)的原码表示, 且阶码用移码表示。
格式:

IEEE 754 标准下,
规格化的短浮点数(float)的真值为:(-1)s × 1.M × 2E-127(E的取值为1~254)
规格化的长浮点数(double)的真值为:(-1)s × 1.M × 2E-1023(E的取值为1~2046)

3.7.3 浮点值的上溢与下溢
上溢时,赋一个表示无穷大的特定值;
下溢时,尾数右移,阶码+1,丢弃尾数的最低位,导致丢失精度。
这篇读书笔记涵盖了C语言中的数据类型,包括关键字如int、float、double等,以及它们在16位、32位和64位系统中的字节长度。还详细介绍了位、字节和字的概念,以及机器字长、指令字长和存储字长的区别。此外,讨论了转义序列在字符串和字符常量中的应用,转换说明在printf函数中的使用。浮点数的表示和舍入误差问题,特别是浮点数的规格化和IEEE754标准也得到了阐述。

被折叠的 条评论
为什么被折叠?



