时长:大小15.97M
作者回复: 这是一个很好的发现! 你可以试着在编译指令中添加 “-pedantic -Werror” 这两个选项,然后看看结果会有什么不同?实际上 Clang 在某些情况下会采用名为 “gnu-folding-constant” 的 GNU 扩展来编译 C 代码,但这并不是 C 标准中的内容。
作者回复: 这个回答很棒!
作者回复: 关于函数调用细节,我们在第 5 和 6 两讲中有介绍的。 相关的书其实有很多哈,比如: 《CSAPP》 《Low Level Programming》 《Modern C》 《X86/64 体系探索与编程》 其他的也可以在比如 Oreilly 上搜一搜哈,它们虽然不是专门讲 C 语言底层的内容,但都是有一定关系的。推荐多参考几本,然后就能找到共通点了。
作者回复: 这个按照 IEEE-754 的组成结构来计算就可以。这里符号位 0 表示正数;指数位为 1,偏置量为 7,对应的阶码为 1 - 7 = -6;尾数为 0.125。所以对应的浮点数为:1.125 * 2 ^ (-6) = 0.01757812。这里 Rounding 了一下,所以变成了 0.017578。
作者回复: 因为位模式不变,但这里 printf 中的格式占位符应该用 “%u” 哈。%d 对应的是 signed decimal integer。
作者回复: 实际上,在代码中用到的字面值就是常量哈。在 C 语言中,常量并没有其他的定义方式。
作者回复: 正解!
作者回复: 没错的。
作者回复: 是一样的哈,你可以按照同样的方式理解。就是把值、函数体,直接放到之前通过变量,或函数调用间接引用的地方。
作者回复: 可以试着在编译指令中添加 “-pedantic-errors” 这个选项,然后看看结果会不会有不同?
作者回复: 这里的原意是没错的,我想突出的是 “C 变量的实际类型会发生隐式转换”这个点。但实际上,强弱类型这个评判标准本来就是模糊的,或者是不推荐使用的。因为强弱是相对的,因此我们可以说 C 的类型是比 JavaScript 强,但比 Ada 弱的。因为 JavaScript 不要求变量具有类型,但 Ada 却要求所有变量都需要有类型,并且仅支持显式的类型转换。这样一比较的话,C 只能处在两者之间。
作者回复: 哪里没有看懂呢?