《C Primer Plus》读书笔记】第3章:数据和C

【《C Primer Plus》读书笔记】第3章:数据和C

  • 3.1 C语言 关键字
  • 3.2 位、字节、字
  • 3.3 机械字长、指令字长、存储字长
  • 3.4 转义序列
  • 3.5 转换说明
    • 浮点数舍入错误
  • 3.6 定点数的表示
    • 3.6.1 定点小数
    • 3.6.2 定点整数
  • 3.7 浮点数的表示
    • 3.7.1 规格化
    • 3.7.2 IEEE 754 标准
    • 3.7.3 浮点值的上溢与下溢

3.1 C语言 关键字

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

数据类型关键字(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 声明变量在程序执行中可被隐含地改变

相关链接:
c语言中的关键字有哪些
c语言程序关键字是什么,C语言中32个关键字详解
C语言关键字
C语言数据类型

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 
#include 
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)。
《C Primer Plus》读书笔记】第3章:数据和C_第2张图片
退格符\b 使得光标移至7个下划线字符的前面,紧跟在 $ 后面。

输入4000.00
《C Primer Plus》读书笔记】第3章:数据和C_第3张图片
按下Enter键
《C Primer Plus》读书笔记】第3章:数据和C_第4张图片
\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 
#include 
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;
}

《C Primer Plus》读书笔记】第3章:数据和C_第5张图片

浮点数舍入错误

浮点值的上溢与下溢。

上溢时,赋一个表示无穷大的特定值;下溢时,尾数右移,阶码+1,丢弃尾数的最低位,导致丢失精度。

程序:

/* floaterr.c -- 演示舍入错误*/
#include 
#include 
int main(void)
{
    float a, b;
    b = 2.0e20 + 1.0;
    a = b - 2.0e20;
    printf("%f\n", a);
    system("pause");
    return 0;
}

结果:
《C Primer Plus》读书笔记】第3章:数据和C_第6张图片
按理来说应该是1.0,出现错误的原因是计算机缺少足够的小数位来完成正确的计算。

3.6 定点数的表示

在计算机参与运算的机器数分为:

  1. 无符号数:整个机器字长的二进制位都是数值位
  2. 有符号数:二进制数的最高位是符号位,其余为数值位

3.6.1 定点小数

定点小数是纯小数,约定:小数点位置在符号位之后,有效数值部分最高位之前。
《C Primer Plus》读书笔记】第3章:数据和C_第7张图片

3.6.2 定点整数

定点整数是纯整数,约定:小数点位置有效数值部分最低位之后。
《C Primer Plus》读书笔记】第3章:数据和C_第8张图片

3.7 浮点数的表示

《C Primer Plus》读书笔记】第3章:数据和C_第9张图片

3.7.1 规格化

通过调整一个非规格化浮点数的尾数和阶码的大小,使非零的浮点数在尾数的最高数位上保证是一个有效值。

左规:当运算结果为非规格化时,尾数算数左移一位,阶码减1
右规:当运算结果尾数出现溢出时,尾数算数右移一位,阶码加1

左规可能要进行多次, 右规只需进行一次

《C Primer Plus》读书笔记】第3章:数据和C_第10张图片

3.7.2 IEEE 754 标准

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

格式:
《C Primer Plus》读书笔记】第3章:数据和C_第11张图片
IEEE 754 标准下,

规格化的短浮点数(float)的真值为:(-1)s × 1.M × 2E-127(E的取值为1~254)

规格化的长浮点数(double)的真值为:(-1)s × 1.M × 2E-1023(E的取值为1~2046)
《C Primer Plus》读书笔记】第3章:数据和C_第12张图片

3.7.3 浮点值的上溢与下溢

上溢时,赋一个表示无穷大的特定值;

下溢时,尾数右移,阶码+1,丢弃尾数的最低位,导致丢失精度。

你可能感兴趣的:(《C,Primer,Plus》读书笔记,c语言,C,Prime,Plus)