【深入理解计算机系统】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)

相关文章
|
4月前
|
存储 缓存 监控
|
4月前
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
479 2
|
3月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
251 48
|
2月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
65 3
|
2月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
2月前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
90 1
|
3月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
113 16
|
3月前
|
人工智能 算法 C语言
编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回整数1,否则返回0
通过上述代码和解释,我们实现了一个高效判断素数的C语言函数 `isprime`。该函数结合了基础判断和优化的循环逻辑,确保高效准确地判断给定整数是否为素数。希望本文能帮助你更好地理解和实现素数判断算法。
69 1
|
3月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
3月前
|
存储 监控 Java
深入理解计算机内存管理:优化策略与实践
深入理解计算机内存管理:优化策略与实践