- 博客(65)
- 收藏
- 关注
原创 无符号数没有正负之分,也就不存在原码、补码这些用于表示正负的概念
无符号数,从名字就能看出,它没有正负之分,只能表示非负整数。在计算机内部,无符号数的存储非常直接,二进制的每一位都单纯地用来表示数值大小。比如我们要存储无符号数 8,它的二进制是 1000,计算机就会直接把这 4 位二进制数存放在对应的存储单元里。如果是更大的数,比如 15,二进制是 1111,同样也是直接存储。在进行运算时,无符号数采用的是最基本的二进制运算规则。这里需要明确的是,,因为原码是针对有符号数表示正负而提出的概念。无符号数的加法就是直接按照二进制位逐位相加,满 2 进 1。
2025-07-20 15:47:03
561
原创 C 语言类型转换
若原浮点值超出int可表示范围(≈±2.1e9),结果未定义// 未定义行为,可能得极大不确定值或崩溃整数间转换:位模式复用(补码规则)等长:改变解释方式不等长:符号/零扩展或截断浮点间转换:精度调整float→double:无损扩展double→float:精度裁切整浮转换:数值重构整数→浮点:可能精度丢失浮点→整数:截断小数+溢出风险指针转换:内存视角切换对象指针:危险但有时必要void指针:安全中介🧠终极心法看位模式?看数值?看内存?整数转换:重点看位模式变化浮点转换:重点看。
2025-07-17 22:46:05
969
原创 1.6 虚拟机
一台物理机器传统模式下通常只能运行一个操作系统:通过虚拟化技术将单台物理机划分为多台逻辑隔离的虚拟计算机。:隐藏物理硬件细节,提供抽象的统一计算环境。
2025-07-13 22:52:36
668
原创 1.5 操作系统引导
同时执行这个磁盘引导程序,并且扫描分区表,找到这个活动分区,也就是安装了操作系统的分区,那只要找到活动分区的起始地址,接下来就可以去读入这个活动分区的第一个部分的内容,也就是引导记录,把这个引导记录读入内存之后,就可以执行这个引导记录里边的程序,那这个程序完成的事情是会从根目录下面去找到完整的操作系统初始化程序。好,那除了你能看得见的这些磁盘分区之外,在你的磁盘的开头的位置会流出一片区域,这片区域用于存储主引导记录,英文缩写叫 MBR,这里面主要包含了两个重要的东西,首先是磁盘引导程序,其次是分区表,
2025-07-13 22:39:54
838
原创 1.4 操作系统结构
为应对操作系统功能增多、代码规模扩大的情况,需合理设计结构,降低复杂度、提升安全性与可靠性,主要有分层法、模块化、宏内核、微内核、外核等结构。
2025-07-13 17:17:10
726
原创 1.3 操作系统的运行环境
计算机系统里,CPU 执行操作系统内核程序(管理程序 )和用户自编程序(被管理程序 )。因作用不同,内核程序执行特权指令,用户程序因安全不能执行,由此划分用户态(目态 )和核心态(管态、内核态 ),靠 CPU 内部 “小开关”(状态位 )切换:0 为核心态,可执行特权指令;1 为用户态,仅执行非特权指令。
2025-07-13 01:25:39
668
原创 [特殊字符] 易混点解析:k / K 的区别 —— 存储 vs 速率的单位陷阱
使用场景单位前缀表示示例使用进制说明存储容量/文件大小大写K/M/G/T...1KB二进制用于内存、硬盘、U盘、文件大小等数据传输速率 / 频率小写k/M/G/T...1kbps十进制用于网络、总线、时钟频率等📌存储容量(硬盘、内存、文件)—— 用大写 K,按 1024 算(2 的幂)📌传输速率(网络、下载、CPU频率)—— 用小写 k,按 1000 算(10 的幂)📎推荐记法K 是大写靠内存,k 是小写跑带宽。
2025-07-06 16:38:36
670
原创 软硬件界面:指令集体系结构(ISA )
只要 CPU 实现相同的 ISA,软件就能无缝运行,无需重写。同一份 ISA 契约(如 x86-64 或 ARMv8-A),可以被不同的厂商用截然不同的内部设计(流水线深度、缓存大小、分支预测算法、执行单元数量等)来实现。硬件设计师在满足 ISA 契约的前提下,可以自由发挥创新(如更深的流水线、乱序执行、更大的缓存、更先进的制程),提升性能或降低功耗,而无需担心破坏上层软件。在计算机世界的核心,存在着一个无形的契约——它让冰冷的硅片能理解人类编写的代码,让操作系统和应用程序能在千差万别的硬件上顺畅运行。
2025-07-06 15:02:12
937
原创 机器指令 微指令 微程序三者关系
以(机器指令)为例:机器指令触发 CPU取指单元获取 → 识别为加法指令 → 向微程序控制器发出请求。微程序响应 控制器在微程序ROM中查找对应的微指令序列起始地址(如地址)。微指令逐条执行机器指令CPU可执行的二进制命令(如 )程序员可见的最底层指令微程序存储在CPU内部ROM中的微指令序列每个机器指令对应一个微程序作用:解释/翻译机器指令微指令微程序的基本组成单元每条微指令包含一组控制信号示例:硬件控制信号直接操作物理硬件的电信号控制晶体管开关、数据通路等最终实现指令功能技术要点:1:N 映射:1条
2025-07-06 11:23:16
271
原创 第一章:绪论
数据类型 和 抽象数据类型(ADT) 的区别顺序存储:把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。链式存储:逻辑上相邻的元素在物理位置上可以不相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。索引存储:在存储元素信息的同时,还建立附加的索引表,索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。散列存储:根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。需要理解几点:核心公式:程序=数据结构+算法算法是 对特定
2025-07-03 22:51:17
611
原创 Master 定理详解
Master 定理是分析分治算法时间复杂度的终极利器,专为处理递归形式的算法设计。它能让你不画递归树、不做复杂推导,30秒内得出时间复杂度!闪电分析:三步搞定递归时间复杂度避免复杂推导:无需展开递归式或画递归树覆盖主流算法:解决 80% 的分治算法分析面试利器:算法岗位高频考点掌握 Master 定理,时间复杂度分析从未如此优雅!下次遇到递归算法时,记住:比较log_b a和d,结果立现。附录:常用对数速算公式(换底公式)
2025-07-03 13:52:58
425
原创 时间复杂度分析套路大全:从单层循环到嵌套与递归
时间复杂度不是靠死记硬背,而是靠你理解**“变量如何变化”和“终止条件如何控制循环次数”**的本质。一旦你掌握了这些“套路”,你会发现刷题中常见的复杂度问题,其实都在这些模型里。
2025-07-02 23:16:49
307
原创 T(n)和O(n)
T(n)是算法运行的“真实代价”,O(n)是对 T(n) 的“上限估计”(最多多快)。T(n) 表示:当输入规模是n时,算法实际执行了多少步(准确一点,也可以是时间、操作次数等)。i < n;i++) {这个程序打印了 n 次“hello”。T(n) = nO(n) 表示:算法运行时间的一个渐进上界,我们关心的是大致趋势,不关心常数和低阶项。比如 T(n) = 3n + 2,虽然实际执行的是3n + 2步,但当n+2太小,可以忽略3n中的 3 也是常数,不影响增长趋势只看增长速度,忽略细节。
2025-07-02 20:14:07
489
原创 sum += ++i 和 sum += i++ 的区别
sum += i++好的,我来帮你详细分析sum += ++i和sum += i++的区别,以及拆分它们的执行步骤。
2025-07-01 16:52:44
394
原创 什么是时间复杂度
时间复杂度 ≈ 整体执行步骤数的数量级估算,循环次数只是最常见的组成部分。所以你说的“时间复杂度是循环次数的估算”,这个说法对了一半,更完整的表达是:⏱️时间复杂度是程序执行步骤的数量级估算,其中循环次数是关键但不是唯一的来源。
2025-07-01 16:16:41
394
原创 (T-1)³ ≤ n < T³是怎么得到的
要推导这个 循环的时间复杂度,可以按下面的思路来算:⑴.确定循环退出的条件循环的判断条件是 当 第一次大于 时,循环就会停止。⑵.用不等式估计最大迭代次数假设循环恰好在第 T 次检查时退出,也就是 那么最坏情况下,循环会执行大约 T 次 操作。⑶.解不等式⑷.得出渐近形式总结方法:先把循环条件写成关于迭代次数 T 的不等式;对不等式两边解出 T 与 n 的关系;最后得到 T 随 n 的增长率(即渐近阶)。✅ 写法一:✅ 写法
2025-07-01 13:57:43
318
原创 理解 数据类型 和 抽象数据类型(ADT) 的区别
要理解 数据类型 和 抽象数据类型(ADT) 的区别,我们可以从 定义、设计目标、特性、应用场景 四个维度拆解,结合例子对比会更清晰:ADT 的 具体实现 依赖数据类型:比如,用 数组(数据类型) 实现栈 ADT:换句话说:数据类型是 ADT 的 “实现工具”,ADT 是数据类型的 “抽象设计”。理解后,学习数据结构时可以更清晰:
2025-06-30 17:04:18
574
原创 C 语言文件操作详解
本文详细介绍了 C 语言中文件操作的基础知识和进阶技巧,包括文件的打开、读写、关闭、定位以及错误处理等内容。文件操作是 C 语言编程中的重要部分,掌握这些知识可以帮助你更好地处理数据存储和读取的需求。使用文件指针打开、关闭文件使用不同模式操作文件进行字符、字符串和格式化的文件读写处理二进制文件进行文件定位和错误处理使用进阶技巧如判断文件存在、重命名和删除文件希望本文对你学习 C 语言文件操作有所帮助!
2025-06-30 09:00:59
735
原创 为什么sizeof(p)得不到堆内存大小
(注意:此时,通过p能找到的信息,其实只有2个1.就是0x0011它的内存首地址2.p的步长,因为p也是有类型的,int类型表示它的步长为四但是,注意:无法知道右边堆中这个空间到底是多大的,如果在代码当中,用sizeof强行测量p的所占用的大小,此时其实只能获取左边这个指针在内存当中占用的字节,是没有方法获取堆里面的这个大空间占用的字节总个数的。所以说,在代码当中,如果说要完整的遍历堆里面的这个空间,那么最好要用一个单独的变量,去记录它的长度才可以要彻底理解sizeof,我们从和当我们用。
2025-06-29 22:32:48
320
原创 C 语言动态内存分配
想象一下:你想写一个程序,让用户输入数组长度,然后存储数据。但—— 如果用户需要 1000 个元素,数组会不够用;如果只需要 5 个元素,剩下的 95 个空间就被浪费了。这时候,就像一把 “魔法钥匙”:它允许程序,用完再 “归还”,让内存利用更灵活高效。
2025-06-29 20:00:57
789
原创 C语言的内存结构
理解内存布局是C语言编程的核心能力,它直接关系到程序的性能、稳定性和安全性。本文将结合图示,系统拆解C语言内存的六大区域及其运作机制。
2025-06-29 19:53:11
881
原创 malloc申请的内存过多,会产生虚拟内存
malloc要理解 malloc的机制,需从、malloc和虚拟内存是操作系统的 “魔法”,让程序以为自己拥有。其核心是mallocmallocmalloc并非直接分配,而是向操作系统申请mallocbrkmmapmalloc假设物理内存是 8GB,程序用malloc。
2025-06-29 19:30:58
492
原创 C语言共用(同)体/联合体(union)详解
使用union数据类型 成员1;数据类型 成员2;...示例:定义一个可以存储整数、浮点数或字符串的共同体// 定义共同体int i;// 整数float f;// 浮点数// 字符串共同体是C语言中一种强大的工具,通过共享内存实现高效的数据存储。虽然它的使用需要谨慎(因为数据会被覆盖),但在特定场景下(如硬件编程、数据解析)能显著优化内存使用。掌握共同体的定义、使用方法和注意事项,能帮助你编写更高效的C程序!
2025-06-29 16:30:05
530
原创 C语言结构体
语法格式struct 结构体名 {数据类型 成员1;数据类型 成员2;// 更多成员...// 声明结构体变量struct 结构体名 变量名;例如:第一步:定义结构体类型需先通过struct// 姓名(字符数组)int age;// 年龄(整数)// 成绩(浮点数)这里是结构体类型名,大括号内是该类型包含的成员变量(字段)。第二步:声明结构体变量表示基于已定义的Student类型,创建一个名为stu1的变量,用于存储具体的学生数据。// 定义学生结构体int age;
2025-06-29 15:17:55
320
原创 C 语言变量类型全解析
C 语言的变量类型系统是其强大功能的重要组成部分,掌握各种变量类型的特点和用法是学习 C 语言编程的基础。本文详细介绍了 C 语言的基本数据类型、构造数据类型、指针类型和空类型,以及变量类型转换的相关知识。希望通过本文的介绍,你对 C 语言的变量类型有了更深入的理解,能够在实际编程中灵活运用这些知识。
2025-06-29 15:17:46
1082
原创 结构体指针 vs 结构体中的指针
2.内存图解3.结构体指针的访问(3 种等价方式)4.核心应用场景动态内存分配函数参数传递(避免拷贝)三、结构体中的指针详解 定义:结构体的某个成员本身是指针变量,用于指向其他数据(如动态字符串、其他结构体等) 语法:在结构体定义中声明指针类型成员 本质:结构体内部包含一个地址存储单元,用于指向外部数据1.示例:2.内存图解3.结构体中指针成员的使用(需解引用)4.核心应用场景实现动态成员
2025-06-29 13:53:43
467
原创 C语言字符串
始终预留空间给\0:数组长度 ≥ 内容长度+1优先使用带n的安全函数:如strncpysnprintf动态内存用完即释放:配对使用mallocfree区分指针与数组char s[]可修改,char *s指向常量区。
2025-06-28 21:01:31
346
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人