深入 C 语言和程序运行原理
于航
PayPal 技术专家
21121 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
深入 C 语言和程序运行原理
15
15
1.0x
00:00/00:00
登录|注册

02|程序基石:数据与量值是如何被组织的?

存放位置
存放位置
存放位置
存放位置
浮点数的存储格式设计
隐式类型转换
补码的英文名称
补码的特点
区别与应用
只读变量 vs. 字面量常量
常量数据
未初始化的全局变量、静态变量
局部变量
全局变量、静态变量
IEEE-754
补码
区别
const 关键字
内联方式直接写到源代码中的字面量值
优化特定场景需求
有符号与无符号类型
硬件体系结构的影响
字节作为单位表示变量宽度
数据类型关键字
通过赋值运算符设定值
设置名称
使用关键字指定数据类型
有符号数还是无符号数
整数类型
size_t 类型的用途
数据的存放位置
数据的存储方式
变量属性控制
数据的存储位置
数据的存储形式
常量
符号性
类型、大小及符号性
定义方式
由“算法”与“数据结构”组成
程序的基石
思考题
总结
变量
量值与数据
C 语言中的量值与数据

该思维导图由 AI 生成,仅供参考

你好,我是于航。
从这一讲开始,我们就进入到了“C 核心语法实现篇”的学习。在这一模块中,我们将围绕 C 语言的七大类核心语法,深入探寻隐藏在语法背后,程序代码的实际执行细节。
C 语言让我们能够用一种可移植、结构化,且具有人类可理解语义的方式,构建我们的程序。C 标准中详细描述了 C 语言在语法和语义两个层面的基本内容,但对于实现者,比如编译器来说,如何将这些语法和语义体现在具体的机器指令(汇编代码)上,标准并未给出详细规定。
所以问题来了:在这层抽象背后,一个 C 程序中的各类语法结构,究竟是如何映射到机器能够识别的不同指令上的?相信学完这一模块,你就能找到这个问题的答案,从而对程序的运行有更细粒度的把控。
今天,我们就从最基本的数据和量值开始。相信你在第一次接触编程这个概念时就会了解到,一个完整的程序是由“算法”与“数据结构”两部分组成的。其中,算法代表程序会以怎样的具体逻辑来运行;数据结构代表程序运行过程中涉及数据的具体组织方式。而在一门编程语言中,数据便是以不同类型“量值”的形式被组织在一起,并交由算法进行处理的。所以我们可以说,数据和量值是程序运行的基石。
今天,我们先从日常使用 C 语言时最直观的编码方式开始,介绍 C 语言中的量值和数据。然后,由源代码的“表象”到计算机内部,我们来看看数据在计算机中存储时是如何被编码的。最后,我们再来一起看下,程序中的各类数据究竟被存放在哪里。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了C语言中数据与量值的组织方式,以及计算机内部数据的存储形式。文章首先介绍了C语言中的量值与数据,将量值分为变量和常量两种形式。对于变量,文章详细讨论了C语言中不同类型的变量,包括其类型、大小、符号性等方面的特点。同时,也指出了C语言中变量类型大小与硬件体系结构的关系,以及与其他编程语言的不同之处。对于常量,文章强调了常量在定义后无法再次修改的特性,并对使用const关键字修饰的只读变量与字面量常量进行了比较。在数据存储形式方面,文章介绍了补码和IEEE-754编码方式的特点,以及在C语言中的应用。补码在有符号整数的存储和运算中具有重要作用,而IEEE-754标准则被广泛应用于浮点数的存储和计算。此外,文章还涉及了C语言中的隐式类型转换和浮点数的排序方式。总体而言,本文通过深入浅出的方式,为读者解析了C语言中数据与量值的组织方式,以及计算机内部数据的存储形式,为读者提供了对程序运行细节的更细粒度把控。文章内容涵盖了C语言中数据类型、存储方式以及与硬件体系结构的关系,为读者提供了全面的技术知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入 C 语言和程序运行原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • Pushsadfc
    置顶
    作者大大,你关于函数是如何被调用的,我想了解更多,应该去看哪些书籍嘞。还有您有哪些好的c语言底层书可以推荐嘞

    作者回复: 关于函数调用细节,我们在第 5 和 6 两讲中有介绍的。 相关的书其实有很多哈,比如: 《CSAPP》 《Low Level Programming》 《Modern C》 《X86/64 体系探索与编程》 其他的也可以在比如 Oreilly 上搜一搜哈,它们虽然不是专门讲 C 语言底层的内容,但都是有一定关系的。推荐多参考几本,然后就能找到共通点了。

    2021-12-23
    4
  • sugar
    置顶
    挺有意思~ 我记得在本科学计算机体系结构时,教科书上对补码的定义是先取反码然后+1。于是当我见到一个int在内存中的布局时我会用上述计算步骤进行逆向操作得到原码再算出人类习惯的十进制数。 在这篇专栏里我才知道原来还有 负权重位 这么一说 是完全另外一种计算方式 得到的结果是一样的 哈哈 是个有趣的数学现象
    2021-12-18
    1
    27
  • 置顶
    我在 mac 环境下 可以使用 const 修饰的只读变量来指定数组长度和 switch case 的值,正常运行了 Apple clang version 13.0.0 (clang-1300.0.29.3) Target: arm64-apple-darwin21.1.0 Thread model: posix

    作者回复: 这是一个很好的发现! 你可以试着在编译指令中添加 “-pedantic -Werror” 这两个选项,然后看看结果会有什么不同?实际上 Clang 在某些情况下会采用名为 “gnu-folding-constant” 的 GNU 扩展来编译 C 代码,但这并不是 C 标准中的内容。

    2021-12-09
    4
    14
  • jack123
    置顶
    typedef unsigned int size_t; 具体类型还要看目标机器上的定义, 不过在一般机器上,size_t被定义成无符号整型 在一些常见C语言的函数的返回值是size_t 比如strlen,sizeof, 值得注意的是,在STL容器做遍历的时候,它里面size()方法返回值也是size_t类型的

    作者回复: 这个回答很棒!

    2021-12-08
    2
    15
  • 纳兰容若
    老师您好 有一个问题请教一下 0 0001 001 为什么表示 0.017578 (图中)

    作者回复: 这个按照 IEEE-754 的组成结构来计算就可以。这里符号位 0 表示正数;指数位为 1,偏置量为 7,对应的阶码为 1 - 7 = -6;尾数为 0.125。所以对应的浮点数为:1.125 * 2 ^ (-6) = 0.01757812。这里 Rounding 了一下,所以变成了 0.017578。

    2022-04-06
    4
  • size_t:一般用于指示数据类型的大小,无符号整型

    作者回复: 正解!

    2021-12-08
    2
    3
  • 龍蝦
    老师,这节提到几次内联,这里的内联跟内联函数的内联是否相同?

    作者回复: 是一样的哈,你可以按照同样的方式理解。就是把值、函数体,直接放到之前通过变量,或函数调用间接引用的地方。

    2022-02-27
    2
  • 石天兰爱学习
    #include<stdio.h> int main(int argc, char *argv[]) { int test_num1 = -10; unsigned int test_num2 = test_num1; printf("%d\n",test_num2); } 请问老师,我这个程序的结果为啥是-10,而不是一个正值呢? (Windows下VS编译环境)

    作者回复: 因为位模式不变,但这里 printf 中的格式占位符应该用 “%u” 哈。%d 对应的是 signed decimal integer。

    2022-01-06
    2
    2
  • 隐式转换有些什么规则或特殊情况么?能否列以下? 感觉这块很坑阿

    作者回复: 具体规则很多,可以参考这里:https://en.cppreference.com/w/c/language/conversion

    2022-09-30归属地:广东
    1
  • 不穿格子衬衫的程序员
    “补码”这一节中:“C 语言作为一种弱类型语言,其一大特征就是在某些特殊情况下,变量的实际类型会发生隐式转换。”这句话是笔误了吧?C 语言是强类型语言吧?

    作者回复: 这里的原意是没错的,我想突出的是 “C 变量的实际类型会发生隐式转换”这个点。但实际上,强弱类型这个评判标准本来就是模糊的,或者是不推荐使用的。因为强弱是相对的,因此我们可以说 C 的类型是比 JavaScript 强,但比 Ada 弱的。因为 JavaScript 不要求变量具有类型,但 Ada 却要求所有变量都需要有类型,并且仅支持显式的类型转换。这样一比较的话,C 只能处在两者之间。

    2021-12-25
    2
    1
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部