【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记

简介: 【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记

前言:

《Computer Systems》学习笔记。


Ⅰ.  学习目的

为了培养对基础计算机系统的一般性理解,提高系统编程技能。数据表示和算术、机器级的程序表示、处理器结构、链接、控制流、虚拟内存、系统级IO、网络编程、并发编程。

Ⅱ.  举几个比较有意思的例子

0x00  例1 - Ints are not Integers

比如,对于 这个问题,

float:YES!

int :

💬 代码验证:

#include <stdio.h>
int main(void) {
    int a = 40000;
    int b = 50000;
    printf("a * a = %d\n", a * a);
    printf("b * b = %d\n", b * b);
    return 0;
}

🚩 运行结果如下:

首先 a * a (40000 * 40000)成功计算出了结果 —— 1600000000,这和我们预想的一样。

但是 b * b (50000 * 50000)计算的结果却并不是我们所预想的 2500000000,而是奇怪的 -1794967296,它计算出来的结果显然是错误的,因为其发生了溢出。

0x02 例2 - Floats are not Reals

再举个例子:    加法满足交换律与结合律。

对于 unsigned int 或 signed int 来说没啥问题。

但是对于 float 来说,情况似乎就不容乐观了:

💬 代码验证:

#include <stdio.h>
int main(void) {
    printf("(1e20 + -1e20) + 3.14 = %f\n", (1e20 + -1e20) + 3.14  );
    printf("(1e20 + -1e20) + 3.14 = %f\n", 1e20 + (-1e20 + 3.14)  );
    return 0;
}

🚩 运行结果如下:

0x03 例3 - 内存引用错误的例子(Memory Referencing Bug)

🔑 出现这种情况的原因:

 

 


参考资料:

Computer Systems: A Programmer's Perspective (3rd Edition)

相关文章
|
5月前
|
缓存 监控 Linux
CentOS系统如何查看当前内存容量。
以上方法都不需要特殊软件或者复杂配置即可执行,在CentOS或其他Linux发行版中都适合运行,并且它们各自透露出不同角度对待问题解答方式:从简单快速到深入详尽;从用户态到核心态;从操作层数到硬件层数;满足不同用户需求与偏好。
420 8
|
6月前
|
存储 缓存 监控
手动清除Ubuntu系统中的内存缓存的步骤
此外,只有系统管理员或具有适当权限的用户才能执行这些命令,因为这涉及到系统级的操作。普通用户尝试执行这些操作会因权限不足而失败。
1289 22
|
10月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
356 27
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
1228 59
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
2388 58
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
579 16
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
519 3
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
664 1
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
628 1