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

C Primer Plus第4章编程题 printf()和scanf()的*修饰符 C Primer Plus第4章编程题 阅读详情
AI摘要

这篇读书笔记涵盖了C语言中的数据类型,包括关键字如int、float、double等,以及它们在16位、32位和64位系统中的字节长度。还详细介绍了位、字节和字的概念,以及机器字长、指令字长和存储字长的区别。此外,讨论了转义序列在字符串和字符常量中的应用,转换说明在printf函数中的使用。浮点数的表示和舍入误差问题,特别是浮点数的规格化和IEEE754标准也得到了阐述。

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声明变量在程序执行中可被隐含地改变

相关链接:
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 <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 定点数的表示

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

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

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 Primer Plus(第6版)中文版》读书笔记 说在开头:这是我学习C语言过程中的读书笔记,内容不全,会边学习边补充。如果文中有说法错误的地方,欢迎大佬指正~ 阅读详情

相关推荐

《C primer plus》读书笔记:目录结构及思维框架

最近在读《C primer plus》这本书,希望总结一下看书的体会和知识,fighting 首先介绍一下本书的目录结构,对书中的要点有个大概的轮廓 目录 第1章 初识C语言 第2章 C语言概述 第3章 数据和C 第4章 字符串和格式化输入/输出 第5章 运算符、表达式和语句 第6章 C控制语句:循环 第7章 C控制语句:分支和跳转 第8章 字符输入/输出和输入验证 第9章 函数 第10章 数组和指针 第11章 字符串和字符串函数 第12章 存储类别、链接和内存管理 第13章.

weixin_44615754的博客 893

整理:C primer plus 学习笔记

前言:简单看了一遍C Primer Plus, 整理了一下,因为时间比较少,自己理解地比较肤浅,所以第一版比较简陋。 假期的时候应该会有时间再整理一下。------2018/11/5 2019/1/23 寒假整理一下笔记。 2019/3/7 大二下学期记:这本书内容还是很多的,举例比较多,也涉及了一些C语言的”高级“特性,有些地方难度很高,但是即使没能掌握也并不影响使用C语言。感觉想用笔记来...

一只大鸽子的博客 1万+

C Primer Plus 第六版 第11章 编程答案

C Primer Plus 第六版 第11章 编程答案 1.第1题 #include <stdio.h> #define SIZE 10 char * getnchar(char *, int); int main(void) { char st[SIZE]; char * sts; printf("请输入:"); sts = getnchar(st, SIZE - 1); if (sts == NULL) puts("输入失败");

LGDNSX 587

《C Primer Plus》(第6版)

《C Primer Plus》(第6版)

ProgramNovice的博客 1万+

《C Primer Plus》编程练习—第9章

第9章练习

chaofeng426的博客 690

基于Python的网络拓扑图绘制

最近写论文画了许多图,在这里记录一些。当然,如果仅仅是展示性图片的话也可以使用visio,但是这里我仍然想探究一下如何使用pyhon画出美观的网络拓扑图。(1)根据邻接矩阵画出网络拓扑图(2)画出网络拓扑图,并对节点和链路进行表示,包括对节点和链路的标号,颜色区分,以及尺寸区分。

m0_53961910的博客 7093

C Primer Plus 第3章习题

P67~P69。

weixin_45641816的博客 1202

YOLOv8优化:特征融合 | 金字塔稀疏 Transformer(PST)——一个轻量级、即插即用的模块 | 25年7月最新成果

将 PST 嵌入当前最先进的实时检测模型(YOLOv11-N/S/M)后,在 MS COCO 上的 mAP 分别提升 0.9%、0.5%、0.4%,而延迟增加极小。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 609

【《C Primer Plus》读书笔记】第1章:初识C语言

《C Primer Plus》第1章:初识C语言

ProgramNovice的博客 3656

国债期货的日线趋势跟踪策略实现(基于backtrader框架)

通过backtrader框架,我们可以轻松地实现国债期货的日线趋势跟踪策略,并进行回测和验证。通过这种策略,我们可以尝试捕捉国债期货价格的短期趋势,并根据趋势的方向进行交易决策。backtrader提供了许多内置的指标、订单类型和其他功能,可以帮助你进一步优化和改进你的策略。它提供了丰富的工具和功能,使我们能够快速实现和验证我们的交易想法。方法中,我们根据当前价格和前一天的价格判断趋势的方向,并根据趋势的变化进行买入或卖出操作。然后,我们设置了初始资金和交易手续费,并将我们定义的策略。来跟踪每日的收盘价。

NisyPhilosophy的博客 402

MFC属性网格控件(CMFCPropertyGridCtrl)完全指南:构建专业属性编辑界面

本文详细介绍了MFC中的CMFCPropertyGridCtrl控件的使用方法。主要内容包括:控件基础用法(初始化、添加属性、事件处理)、高级设置(自定义外观、创建属性类型、动态更新)、派生类实现(自定义绘制、搜索过滤功能)、界面集成技巧(对话框布局、属性编辑器)以及实际应用示例。文章重点讲解了如何通过继承和自定义实现复杂功能,并提供了性能优化、多语言支持等最佳实践方案。该控件适用于需要大量参数配置的应用程序,能够创建类似Visual Studio属性窗口的专业界面。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 154

C Primer Plus 第7章习题

P212~P216

weixin_45641816的博客 1067

Harness Engineering:让Coding Agent真正落地生产

本文将带你系统性地了解如何让Coding Agent真正落地生产,核心是依托(全球领先的持续交付、云成本管理、 feature flagging、安全治理一体化平台),结合企业级AIDD(AI-Driven Development)的工程化实践,构建一套可信赖、可观测、可扩展、可治理的Coding Agent落地体系。核心概念与理论基础:什么是Coding Agent?它和普通的AI代码补全工具(比如GitHub Copilot)有什么区别?什么是Harness Engineering?

移动开发前沿的博客 454

《C Primer Plus》编程练习—第11章

第11章练习

chaofeng426的博客 725

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目 注:本文主要目的是对于往年国奖项目案例-可视化项目的深入剖析讲解,对源码、项目特点、要点、特色继续深入分析。帮助大家学习技术,掌握规律。

一键难忘的博客 3725

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

974

C Primer Plus 第4章——第一篇

P71~P92

weixin_45641816的博客 1365

2025年微信小程序获取手机号授权登录注册详细教程(含服务端)。不弹窗原因以及减少组件用量的方法

前端把获取到的code传给后端,后端获取access_token和前端传过来的code,请求服务器接口,即可获取到手机号。

coderYYY的博客 3万+

《C Primer Plus》第11章复习题与编程练习

《C Primer Plus》第11章复习题与编程练习

ProgramNovice的博客 1638

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《C Primer Plus》编程练习—第16章

C Primers Plus 第16章编程练习

chaofeng426的博客 2802

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C Primer Plus 第六版 第12章 编程答案

C Primer Plus 第六版 第12章 编程答案 1.第1题 #include <stdio.h> void critic(int * n); int main(void) { int units = 0; printf("How many pounds to a firkin of butter?\n"); scanf("%d", &units); while (units != 56) critic(&units)

LGDNSX 405

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C Primer Plus 第5章习题

P131~P135

weixin_45641816的博客 893

《C Primer Plus》部分课后习题

看书后做习题的时候,顺便写的答案,监督下自己,更新中… (太简单的题目就没写了) 写到了【第8章】

qq_34829036的博客 710

《C Primer Plus》编程练习—第14章

C Primer Plus第14章编程练习

chaofeng426的博客 1138

《C Primer Plus》编程练习—第12章

第12章练习

chaofeng426的博客 405

C Primer Plus 第6版 编程练习——第4章

6.编写一个程序,先提示用户输入名,然定提示用户输入姓。3.编写一个程序,读取一个浮点数,首先以小数点记数法打印,然后以卷数记数法打印。7.编写一个程序,将一个double类型的交量设置为1.0/3.0,一个floaz类型的交量设置为1.0/3.0.5,编写一个程序,提示用户输入以兆位每秒(Mbis)为单位的下视速度和以兆字节(MB)为单位的。点后面1位数字,注意,美国采用的方案量消耗单位燃料的行程(值越大越好),而欧洲则采用。1.编写一个程序,提示用户输入名和姓,然后以“名,姓”的格式打印出来。

geesehoward20000的博客 703
上一篇: Leetcode2016. 增量元素之间的最大差值
下一篇: 《C Primer Plus》第3章复习题与编程练习
UestcXiye
博客等级 码龄8年 9027粉丝 1306原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值