02|程序基石:数据与量值是如何被组织的?
![](https://static001.geekbang.org/resource/image/b5/ea/b56c804c062c576037ae4f8daff3daea.jpg)
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
![](https://static001.geekbang.org/resource/image/d0/e4/d0880927e2a522a038be2d04bf19dfe4.png)
本文深入探讨了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-234 - sugar置顶挺有意思~ 我记得在本科学计算机体系结构时,教科书上对补码的定义是先取反码然后+1。于是当我见到一个int在内存中的布局时我会用上述计算步骤进行逆向操作得到原码再算出人类习惯的十进制数。 在这篇专栏里我才知道原来还有 负权重位 这么一说 是完全另外一种计算方式 得到的结果是一样的 哈哈 是个有趣的数学现象2021-12-18127
- 奕置顶我在 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-09414 - jack123置顶typedef unsigned int size_t; 具体类型还要看目标机器上的定义, 不过在一般机器上,size_t被定义成无符号整型 在一些常见C语言的函数的返回值是size_t 比如strlen,sizeof, 值得注意的是,在STL容器做遍历的时候,它里面size()方法返回值也是size_t类型的
作者回复: 这个回答很棒!
2021-12-08215 - 纳兰容若老师您好 有一个问题请教一下 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-064 - 柴size_t:一般用于指示数据类型的大小,无符号整型
作者回复: 正解!
2021-12-0823 - 龍蝦老师,这节提到几次内联,这里的内联跟内联函数的内联是否相同?
作者回复: 是一样的哈,你可以按照同样的方式理解。就是把值、函数体,直接放到之前通过变量,或函数调用间接引用的地方。
2022-02-272 - 石天兰爱学习#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-0622 - 无隐式转换有些什么规则或特殊情况么?能否列以下? 感觉这块很坑阿
作者回复: 具体规则很多,可以参考这里:https://en.cppreference.com/w/c/language/conversion
2022-09-30归属地:广东1 - 不穿格子衬衫的程序员“补码”这一节中:“C 语言作为一种弱类型语言,其一大特征就是在某些特殊情况下,变量的实际类型会发生隐式转换。”这句话是笔误了吧?C 语言是强类型语言吧?
作者回复: 这里的原意是没错的,我想突出的是 “C 变量的实际类型会发生隐式转换”这个点。但实际上,强弱类型这个评判标准本来就是模糊的,或者是不推荐使用的。因为强弱是相对的,因此我们可以说 C 的类型是比 JavaScript 强,但比 Ada 弱的。因为 JavaScript 不要求变量具有类型,但 Ada 却要求所有变量都需要有类型,并且仅支持显式的类型转换。这样一比较的话,C 只能处在两者之间。
2021-12-2521