Error[8]: Undefined offset: 723, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

【《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布尔型数111
char单字节整型数或字符型数据111
unsigned char无符号单字节整型数或字符型数据111
short短整型数222
int整型数244
unsigned int无符号整型数244
long长整型数448
unsigned long长整型数448
long long长长整型数888
float单精度型浮点数444
double双精度型浮点数888
long double长双精度型浮点数1616
*指针248

控制语句关键字(12个):

关键字说明
forfor循环结构
dodo循环结构
whilewhile循环结构
break跳出当前循环
continue结束当前循环,开始下一轮循环
if条件语句
else条件语句否定分支
goto跳转语句
switch开关语句(多重分支语句)
case开关语句中的分支标记
default开关语句中的“其他”分支可选
return返回语句

存储类型关键字(4个):

关键字说明
auto声明自动变量
exturn声明外部变量
register声明寄存器变量
static声明静态变量

其它关键字(4个):

关键字说明
const声明只读变量(不可更改的常量值)
sizeof得到特定类型或特定类型、变量的大小
typedef声明类型别名
volatile声明变量在程序执行中可被隐含地改变

相关链接:
class="superseo">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 转义序列

转义序列用于在字符串字面量和字符常量中表示某些特殊字符。

oo(或\nnn)/* escape.c -- 使用转义序列*/
转义序列含义
\a报警(ANSIC)
\b退格
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\反斜杠 (\)
\’单引号
\ "双引号
八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数)\xhh
十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数

相关链接:
转义序列

示例:

#
include# 
includeint 
main ()float
{
    ; salaryprintf

    ("\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# 
includeint 
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 & ;aprintf
    ("%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 ;}
/* floaterr.c -- 演示舍入错误*/

浮点数舍入错误

浮点值的上溢与下溢。

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

程序:

#
include# 
includeint 
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 定点数的表示

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

    1. 有符号数:二进制数的最高位是符号位,其余为数值位
    2. s
    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)E-127 × 1.M × 2s(E的取值为1~254)

    规格化的长浮点数(double)的真值为:(-1)E-1023 × 1.M × 2[+++](E的取值为1~2046)

    3.7.3 浮点值的上溢与下溢

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

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

    )
    File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
    File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
    File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
    《C Primer Plus》读书笔记】第3章:数据和C_C_内存溢出

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

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

    【《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个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。

    数据类型关键字(12个):

    关键字说明
    int整形变量
    long长整数型变量
    short短整数型变量
    unsigned无符号类型变量
    char单字节整型变量或字符
    float单精度浮点数
    double双精度浮点数
    signed有符号类型变量
    void无类型变量
    _Bool布尔值
    _Complex复数
    _Imaginary虚数

    C语言中常见的数据类型:

    关键字数据类型字节长度(16位系统)字节长度(32位系统)字节长度(64位系统)
    bool布尔型数111
    char单字节整型数或字符型数据111
    unsigned char无符号单字节整型数或字符型数据111
    short短整型数222
    int整型数244
    unsigned int无符号整型数244
    long长整型数448
    unsigned long长整型数448
    long long长长整型数888
    float单精度型浮点数444
    double双精度型浮点数888
    long double长双精度型浮点数1616
    *指针248

    控制语句关键字(12个):

    关键字说明
    forfor循环结构
    dodo循环结构
    whilewhile循环结构
    break跳出当前循环
    continue结束当前循环,开始下一轮循环
    if条件语句
    else条件语句否定分支
    goto跳转语句
    switch开关语句(多重分支语句)
    case开关语句中的分支标记
    default开关语句中的“其他”分支可选
    return返回语句

    存储类型关键字(4个):

    关键字说明
    auto声明自动变量
    exturn声明外部变量
    register声明寄存器变量
    static声明静态变量

    其它关键字(4个):

    关键字说明
    const声明只读变量(不可更改的常量值)
    sizeof得到特定类型或特定类型、变量的大小
    typedef声明类型别名
    volatile声明变量在程序执行中可被隐含地改变

    相关链接:
    class="superseo">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 转义序列

    转义序列用于在字符串字面量和字符常量中表示某些特殊字符。

    oo(或\nnn)/* escape.c -- 使用转义序列*/
    转义序列含义
    \a报警(ANSIC)
    \b退格
    \f换页
    \n换行
    \r回车
    \t水平制表符
    \v垂直制表符
    \反斜杠 (\)
    \’单引号
    \ "双引号
    八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数)\xhh
    十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数

    相关链接:
    转义序列

    示例:

    #
    include# 
    includeint 
    main ()float
    {
        ; salaryprintf
    
        ("\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# 
    includeint 
    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 & ;aprintf
        ("%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 ;}
    /* floaterr.c -- 演示舍入错误*/
    
    

    浮点数舍入错误

    浮点值的上溢与下溢。

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

    程序:

    #
    include# 
    includeint 
    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 定点数的表示

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

    1. 有符号数:二进制数的最高位是符号位,其余为数值位
    2. s
    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)E-127 × 1.M × 2s(E的取值为1~254)

    规格化的长浮点数(double)的真值为:(-1)E-1023 × 1.M × 2(E的取值为1~2046)

    3.7.3 浮点值的上溢与下溢

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

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

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/langs/799074.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-06
    下一篇 2022-05-06

    发表评论

    登录后才能评论

    评论列表(0条)

    保存