- 博客(26)
- 资源 (16)
- 问答 (1)
- 收藏
- 关注
原创 解开初始化语句的“迷雾重重“(你想知道的C语言 4.1)
Q: int a = b = 3; 为什么会编译错误?A: 要看情况。C语言的变量必须先声明后定义。上面的表达式,如果b声明过,可以编译过,如果没有,才会编译错误。Q:C语言为什么支持上面看起来怪怪的表达式?A:看看C标准。 请自行脑补。Q: int i = 3.2f; i为什么等于3 ?A:C语言标准规定float到int, 只取整数部分,丢弃小数部分。至于i是如何被赋值为3,一般编译器会先计算出3,直接赋值给i. 也许有人会想到编译器是如何计...
2020-07-28 22:24:50 407
原创 声明和初始化(你想知道的C语言 3.9)
Q: 为什么变量需要先声明才能使用?A: 编译型语言的本质要求。变量的类型必须确定才能确定大小并生成机器代码。 试想 i = 1; 这种语句编译器要怎么看待i? 解释型语言一般不需要声明就可以使用,因为它们先默认当做字符串,在需要用的时候再转换成需要的类型。Q: 自动变量未初始化时值为什么是不确定的?A:堆栈数据的不确定性是其本质原因。没有任何操作系统会在使用堆栈时做初始化,一则没必要,二则损失性能。Q: 怎么证明堆栈数据是不确定的?A:...
2020-07-27 21:07:31 505
原创 精确度(你想知道的C语言 3.8)
Q: 只要涉及到浮点数,每本书基本都会说它不是精确的,我们该如何理解精确二字?A: 精确永远都是相对而言。当我们认为1、2、3...自然数是精确的,自然C语言中int/char都是精确的。如果我们认为1.33是精确的,那么它就是精确的。那为什么浮点数会被认为不是精确的呢? 以4字节浮点数为例,符号位/指数位和有效位的位数都是固定的,当某个浮点数的有效位超出预设,那么就不能精确表达了。 对于int来说,其实也不能说是精确的,当我们认为间隔1其实不是精确,那int就不是精确的...
2020-07-24 19:18:51 1606 1
原创 溢出 (你想知道的C语言 3.7)
Q: 溢出的本质是什么?A: 江河漫漫,才华会溢,箱子会满,人会吃饱。无止境增加一定会满,事物的有限性,物质和欲望增长一定会撑不住。Q: N字节无符号整形最大值再加1会变成什么?A: 思考1字节的情形:unsigned char c = UCHAR_MAX;printf("%d\n", (unsigned char)(c + 1));0 UCHAR_MAX是0xFF, 加1等于0x100, 1被丢弃!Q: N字节有符号整形最大值再加1会变成什么?A...
2020-07-21 22:34:26 388
原创 C和汇编(你想知道的C语言 3.6)
C语言其实是个绝世高手,它一直隐藏"汇编“的身份,别人以为汇编是汇编,C语言只是默默一笑: 汇编只是我的代理人。Q: 选择语句if是如何对应汇编的?A:int i;int j;if (i == 1) j = 0;else j = 1;0000000100000f92 cmpl $0x1, -0x14(%rbp) // i == 1 ?0000000100000f96 jne 0x100000fa80000000100000f9c movl $0x0, -0x1..
2020-07-20 22:34:22 521
原创 有符号数和无符号数(你想知道的C语言 3.5)
Q:整数区分出有符号数和无符号数的意义是什么?A:整数有正数也有负数,有符号数为了在基本数据类型大小之内既表达正负,又表达数值,才不至于在表达正负依赖其他基本类型或复杂类型协助,失去C语言简洁的特性。 无符号数相当于只有正数,在常规意义数值分析上最大挖掘和表达类型内存空间的范围。 Q:浮点数为何没有有符号数和无符号数的称呼?A: 浮点数一般采用IEEE754去表达,已有符号位,不需有符号和无符号特别称呼。Q: CPU如何识别有符号和无符号数?A: 其实...
2020-07-19 16:25:38 369
原创 整数的内部形态(你想知道的C语言 3.4)
Q: 探究整数的内部形态有何意义?A: 整数的二进制形态对于理解计算机处理的比特信息有重要意义,对于分析和扩展新类型以及解释牛鬼蛇神变态的数据操作有不可替代的支撑作用。Q: int i = 100; i内部保存的二进制形式是什么?A:/* Xi Chen(511272827@qq.com) cxsjabcabc*/#include <stdio.h>#include <stdlib.h>void dump_int_bits(int n)..
2020-07-18 21:51:30 239
原创 常量和变量(你想知道的C语言 3.3)
Q: 常量和变量的本质区别是什么?A: 常量是不可改变的"变量", 变量是可改变的"常量". 我中有你你中有我是世界的本质,常量和变量只是为了方便表达特定含义的代名词,它们都是一种实体存在。 我们可能会关注常量和变量在编译器或者运行期表达方式的不同,常量的不可改变特性有优化的可能。Q: const int i = 1和int i = 1有何差异?A: const是写给编译器看的, 为防止修改i的代码出现,而汇编代码不受const影响。const int i = 1;int...
2020-07-18 21:01:14 322
原创 C语言内置类型(你想知道的C语言 3.2)
Q: char类型、int类型和long类型的长度由什么决定?A: 在不同的系统或编译系统上, int有时是2字节, 有时是4字节. 编译器决定着int究竟是2字节还是4字节. C语言标准没有规定int类型的准确长度, 因为它是标准, 不能太个性化。C语言只是粗略地规定char <= short <= int <= long. 从编译器的角度, 它解析到int类型, 它是当做2字节还是4字节完全随性, 如果真想个性,也可以是5字节。Q: 如何证明...
2020-07-17 22:19:41 487
原创 程序是如何运行的(你想知道的C语言 3.1)
Q: 32位和64位程序比较常见, 为何没有33位/65位程序不常见?A: 计算机以二进制起家, 寄存器/对齐/内存多以2倍数存在, ASCII码1字节作为标配, 计算机基本处理单元为8位倍数. 16位寻址无法满足对内存越来越大的需求, 32位应运而生. 4GB最大寻址已经无法满足日益增长的内存需求, 64位操作系统产生了.Q: 32位和64位应用程序的差异在哪里?A: 作者: 陈曦环境: MacOS 10.14.5 Apple ...
2020-07-15 22:28:25 245
原创 TTY read系统调用(你想知道的C语言 2.6)
Q: 程序调用read系统调用等待输入, 键盘输入1个字符后执行了哪些流程?A: 从大的框架来看: 按键中断 --> 按键驱动程序解析key --> 投递给当前TTY驱动 --> (默认)回显字符 --> TTY驱动保存输入字符 --> (如果是换行符)唤醒read系统调用返回到用户程序继续运行Q: 按键中断程序传递按键到TTY的接口是?A:tty_insert_flip_char和tty_schedule_flip函数. 前者把...
2020-07-14 21:42:29 935
原创 scanf 缓冲区原理(你想知道的C语言 2.5)
在正式解说scanf缓冲区之前,我们先吃几个开胃小菜.Q: 为什么调用scanf函数线程会停住等待输入?A: scanf会调用read系统调用获取用户输入的信息, 在没有准备好已有的输入或重定向, read一定会等待.作者: 陈曦环境: MacOS 10.14.5 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0 ..
2020-07-13 21:34:05 983
原创 scanf 格式和输入不匹配(你想知道的C语言 2.4)
printf章节, 我们有提到格式符和参数不匹配, scanf同样存在类似的问题, 分析此类问题的最佳途径依然是libc源代码和汇编. printf 格式串和参数不匹配的后果(你想知道的C语言 1.10)Q: scanf("%d", &n); 输入1.5, n是多少?A: 1.5被当做浮点数? 当然不是, scanf对于所有输入都当做字符, 在如上场景, 接收到小数点时, 就终止了! 所以n是1. https://opensource.apple.com/so...
2020-07-12 19:01:38 2893 4
原创 %d %i的区别(你想知道的C语言 2.3)
Q: 格式%d和%i的差别是什么?A: printf: 无差异; scanf: %i除了有%d的十进制输入功能外,还支持八进制和十六进制输入.#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc, char *argv[]){ int n1, n2; scanf("%d %i", &n1, &n2); printf("%d %d\n",
2020-07-12 18:35:01 2417
原创 scanf 参数为什么需要取地址(你想知道的C语言 2.2)
Q: 同样是整数参数, 为什么printf只需要传入参数本身,而scanf需要取地址?A: printf只需要获得参数数值,scanf需要修改变量的能力! 从技术的角度, printf一样可以强制要求取地址, 内部多一道解引用取出数值, 所以没必要! 而scanf, 传入的参数是值传递, 没办法修改到原变量,所以必须要取地址. Mac Libc: 以int为例, 最后是从参数中取int *, 然后存入输入的数据res. C...
2020-07-11 10:52:24 3367 3
原创 scanf 返回值(你想知道的C语言 2.1)
Q: scanf的返回值和printf返回值一样吗?A: scanf的返回值和printf返回值不一样, scanf对于输入多少字符并不敏感, 大多数情况下毫无意义. 但它对输入的变量个数很感兴趣. 参考:printf 返回值 (你想知道的C语言 1.1)These functions(scanf/fscanf...) return the number of input items assigned. 只输入一个变量:/* Xi Chen(511272827@qq....
2020-07-11 10:05:04 4060
原创 printf 格式串和参数不匹配的后果(你想知道的C语言 1.10)
Q: 如下代码的输出结果是多少?#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc, char *argv[]){ printf("%d\n", 1.5); return 0;}A: %d本来对应的是整形,实际参数传入浮点数1.5. 1.5会强制转换成整形1吗? 对于此类问题, 最佳的分析手法是从原理和汇编出发, 不论什么格式都可以分析出...
2020-07-10 21:17:14 2926
原创 printf \a 响铃的流程(你想知道的C语言 1.9)
Q: printf("\a")响铃的动作是在哪里执行的?A: 首先考虑是libc对转义字符'\a'做了特殊处理或者write系统调用中kernel对'\a'做了特殊处理. 这两种方式都有弊端,它们无法灵活处理用户的配置. 比如有的用户想要关闭响铃或者响铃换成闪屏提醒,这些都不能做到。 现代操作系统一般会把'\a'最终要执行的动作交给终端应用程序,以实现灵活配置. 以iTerm2为例: 终端接收到'\a'字符, 会根据配置决定是否做响应动作. act...
2020-07-09 21:39:07 4095
原创 Terminal TTY Console Shell Stdout傻傻分不清(你想知道的C语言 1.8)
Q: 计算机的书籍中,在描述终端/shell的时候,到处充斥着tty/console/shell/stdout之类的字眼,我们该如何理解它们?A: 因为历史原因, 有一些名词慢慢失去了最开始的含义,而跟着时代变迁开始有新的含义。作者: 陈曦环境: MacOS 10.14.5 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0..
2020-07-08 21:50:30 799
原创 回车和换行 \r \n(你想知道的C语言 1.7)
Q: 何为"回车", 何为"换行"?A: 回车的英文是"Carriage Return", 换行为作者: 陈曦环境: MacOS 10.14.5 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0 转载请注明出处...
2020-07-07 08:17:46 1225
原创 \t 宽度(你想知道的C语言 1.6)
Q: 制表符的起源是什么?A: “Tab”一词由英文“tabulate”派生而来,意思是“以表格、或表格形式排列数据”。在打字机上如果要输入一份文字或数字表格,必须不断使用空白键以及Backspace键,不仅重复也十分费时。为了简化这道程序,人们发明了可移动的杠杆,借由在横杆上移动而在页面不同位置输入。一开始这些机关必须手动设置,但不久便有了“Tab set”(设置Tab)与“tab clear”(清除Tab)按键。当Tab键弹起,打字机的滑动架便会推进到下一个定位点(tab stop),而这些定位点.
2020-07-06 22:26:07 1486
原创 printf 为何不是关键字 (你想知道的C语言 1.5)
Q: printf是C语言关键字吗?A: 我们用代码来测试一下.#include <unistd.h>#include <stdio.h>#include <fcntl.h>int main(int argc, char *argv[]){ int printf; return 0;} 是可以编译通过的! 所以,printf一定不是关键字.Q: 标准输入输出是一个很通用的概念,为什么printf不被设计成关键字呢?A: ...
2020-07-06 20:10:06 5517
原创 printf 缓冲区问题分析 (你想知道的C语言 1.4.1)
Q: 程序发生了异常将终止,printf 缓冲区的数据还会刷新吗?A: 在程序发生异常的时候,操作系统可能会直接结束应用程序,这会导致IO缓冲区的数据不能及时刷新.#include <stdio.h>#include <unistd.h>#include <fcntl.h>int main(int argc, char *argv[]){ printf("hello, my cat"); sleep(3); printf("Byebye, my
2020-07-06 19:46:48 310
原创 printf 缓冲区原理 (你想知道的C语言 1.4)
Q: 缓冲区究竟是什么概念?A: 缓冲: 顾名思义, 表示可以酌情商量有回旋余地. 可以想象一种只能强制遵守且说一不二的情形,一种可以协商开发此消彼长的模式. 区: 理解成可以协助存储/处理的物理位置,一般理解成内存。 计算机科学的"缓冲区"概念可以说是到处都有, 这种模式的作用至少有两种: 1 协助存储和内部处理; 2 尽可能提高潜在的效率. 就像是数学课代表统一把作业本交到办公室要比每个学生都跑一遍办公室更高效. Q: pri...
2020-07-05 12:10:10 5070
原创 tty读写之内核实作 (你想知道的C语言 1.3.1)
作者: 陈曦环境: MacOS 10.14.5 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0 Linux 3.16.83 转载请注明出处Q: console和tty是什么关系?A: 一般来说,console被当做是物理终端或者单用户模式的终端, tty我们一般叫做虚拟终端,一般是GUI终端内部模拟的终端..
2020-07-04 17:43:07 731
原创 write系统调用的实现 (你想知道的C语言 1.3)
作者: 陈曦环境: MacOS 10.14.5 Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.6.0 转载请注明出处Q: 承接printf的底层实现,write系统调用是否就是写到stdout文件最后传递给LCD驱动显示?A: write系统调用确实会把数据写到kernel stdout buffer, 但不会直接传递给LCD驱动显示..
2020-07-04 14:22:47 1582
JESD209-5-LPDDR5-注释解读v1
2024-07-04
JESD209-4B-LPDDR4 注释解读 v3
2024-07-04
DRAM技术精解(第三版 中文)
2024-07-04
JESD209-4B-LPDDR4 中文解读 v2.3
2022-10-23
DRAM技术精解(第三版 中文) DDRX LPDDRX
2022-10-23
JESD209-5_4_3 LPDDR5 LPDDR4 LPDDR3精解
2022-03-12
JESD209-4_3 LPDDR4 LPDDR3精解.pdf
2021-12-12
JESD209-3 LPDDR3精解.pdf
2021-11-26
JESD79-5_4_3 DDR5 DDR4 DDR3精解.pdf
2021-11-21
JESD79-4B DDR4 JESD79-3F DDR3 精解.pdf
2021-11-16
JESD79-3 DDR3 Technology.pdf
2021-11-13
JESD79-3 DDR3精解.pdf
2021-10-25
JESD79-4 DDR4解读.pdf
2021-10-13
DRAM技术精解(中文) DDR3-DDR4-DDR5-LPDDR3-LPDDR4-LPDDR5.pdf
2021-10-02
Android十年终极开发经验_助您不走弯路_快速晋级Android架构师
2021-08-08
JESD209-4C LPDDR4解读.pdf
2021-08-01
JESD79-3F_DDR3 中文注释解读 v3.pdf
2021-07-18
JESD79-E_DDR 中文注释解读 v2.2.pdf
2021-07-17
JESD209-4B_LPDDR4 中文注释解读.pdf
2021-06-18
DRAM Technology DDR3_DDR4_DDR5_LPDDR3_LPDDR4_LPDDR5技术精解.pdf
2021-01-31
DDR4为何没有类似LP3的CA training或者LP4的CBT?
2020-12-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人