深入理解计算机系统 (第 1 节)
1. c 语言之数组的越界访问 :
从上面的代码可以看到,在 c 语言里面,数组可以越界访问。但是越界到下标为 6 的时候为什么就不行了呢 ?(有趣但奇怪)
**从结构体 struct_t 来看,看 struct_t 在栈上开辟的空间,数组 a 和 double 类型的变量 d 是相邻的。double 是 8 个字节。下标为 4 和 5 的位置应该是没有人来使用的内存碎片,所以 fun(4) 和 fun(5) 都没有报错,但 fun(6) 就报错了,访问了别人的空间(非法访问) **
所以 c 语言的数组的这种变态访问也应该是 c 语言的不足,所以在 c++ 的 STL 模板的 vector 容器里面可以用 assert(下标的合理取值) 来直接检测下标的越界访问。因为这种情况在一些可能的情况下,可能出现很大的问题哦。
因为正如你所看到的那样,它不会执行边界检查,所以很容易编写出非法代码
2. c 语言诡异的二维数组赋值操作 :
上面是图片左边是一行一行进行赋值的(从 src 原数组赋值到目标数组 dst),有什么诡异的现象呢 ?
其实就是下面的赋值时间问题。
一行一行的访问,比一列一列的访问要好得多
3. & | ~ ^ 操作的国外理解 :
& :把两个二进制序列,下标都是 1 集合的进行 交集 的操作,就得到了结果数组在什么下标下是 1 的集合。
- | :把两个二进制序列,下标都是 1 集合的进行 并集 的操作,就得到了结果数组在什么下标下是 1 的集合。
- :这个是针对单一二进制序列的,1 变 0,0 变 1,就可以了,很好记忆和理解。
^ : 把两个二进制序列,下标都是 1 集合的进行 并集 - 交集 的操作,就得到了结果数组在什么下标下是 1 的集合。
4. 关于 signed 和 unsigned’ 类型的二进制序列转换十进制的计算 :
先要知道 singed 类型的第一位二进制是表示符号的,0 表示是正数,1 表示是负数。所以负数的个数比较正数的个数多一个,因为 0 不是正数也不是负数
singed : (0111)2 == (7)10, 7 = 2^2 + 2^1 + 2^0
(1111)2 == (-1)10, -1 = -1*2^3 + 2^2 + 2^1 + 2^0 (最高位的权重是 -2^n-1)
unsinged : (0111)2 == (7) 10
(1111)2 == (15)10, 15 = 1*2^3 + 2^2 + 2^1 + 2^0
再来一张图片来理解一下:
5. unsigned 在 c 语言里面是明确的诗句类型,在 java,python 里面不是哦:
所以在使用 unsinged 和 singed 的时候要考虑类型的转化,来看看吧(singed 和 unsinged 都有都情况下,一般是转换成 unsinged 类型了)
需要理解正数的 原码,反码,补码 都是一样的。负数的是不一样的。计算机存储的是补码
解释一下:-1 和 0U 哪一个大的问题。
-1 是有符号的 -1,补码是 1111 (也可以特殊记忆 -1,都是 1 的二进制序列,就是 -1。像 11,111,111111,…)。因为是和无符号的 0 进行比较,所以有符号的 -1 变成无符号的就变成了无符号里面当前二进制序列位数的最大值。肯定比较 0 大。
6. c 语言 signed 和 unsigned 的注意使用事项实例 :
for(unsigned i = n - 1; i >= 0; i--){fun(nums[i]);
}// 上面的代码就会一直进行下去,直接死循环
// 因为 unsigned 的 i 肯定是 >= 0 的所以会死循环
for(int i = n - 1; sizeof(char) >= 0; i--){fun(nums[i]);
}// 上面的代码也会死循环
// 因为 sizeof() 的返回值是 unsigned 类型的(注意哦)
7. 怎么保留二进制序列的最后 n 位 ? :
举个列子 :如果你只要保留二进制序列的最后 3 位,直接对 8 取模就可以了。因为对 8 取模的结果是 0 - 7 刚好可以用 3 位的二进制序列表示。
留二进制序列的最后 n 位 ? :
举个列子 :如果你只要保留二进制序列的最后 3 位,直接对 8 取模就可以了。因为对 8 取模的结果是 0 - 7 刚好可以用 3 位的二进制序列表示。
所以保留最后的 n 位应该也不成问题了吧。
深入理解计算机系统 (第 1 节)相关推荐
- 深入理解计算机系统 2.1 节信息存储,深入理解计算机系统(原书第3版)- 第2章 信息的表示和处理 笔记...
2.1 信息存储 1字节(byte)= 8位(bit) 2.1.1 十六进制表示法 十六进制(简写为"hex")使用数字 '0' ~ '9' 以及字符 'A' ~ 'F' 来表示. ...
- 虚拟内存(深入理解计算机系统原书第3版9节读书笔记)
深入理解计算机系统(原书第3版)读书笔记,其实就是嚼碎了原文然后把一部分挑了出来摘要,免得读着读着忘了 文章目录 前言 一.物理和虚拟寻址 二.地址空间 三.虚拟内存作为缓存的工具 1.DRAM缓存的 ...
- 深入理解计算机系统(3)
深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来 ...
- 《深入理解计算机系统》第七章读书笔记
<深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...
- 深入理解计算机系统9个重点笔记
引言 深入理解计算机系统,对我来说是部大块头.说实话,我没有从头到尾完完整整的全部看完,而是选择性的看了一些我自认为重要的或感兴趣的章节,也从中获益良多,看清楚了计算机系统的一些本质东西或原理性的内容 ...
- 《深入理解计算机系统》第七章 链接
<深入理解计算机系统>第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(货被拷贝)到存储器并执行. 链接的时机 编译时,也就是在源代码被翻译成 ...
- HIT深入理解计算机系统大作业
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算机 学 号 120L021909 班 级 2003006 学 生 邢俊文 指 导 ...
- 《深入理解计算机系统》之浅析程序性能优化
此文已由作者余笑天授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 本文主要是基于我之前学习<深入理解计算机系统>(以下简称CSAPP)这本书第五章优化程序性能内容 ...
- 《深入理解计算机系统》课本第七章自学笔记——20135203齐岳
<深入理解计算机系统>课本自学笔记 第七章 链接 By20135203齐岳 链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行. 现代 ...
- 2021春深入理解计算机系统大作业---hello的一生
计算机系统 大作业 题 目 程序人生-Hello's P2P 专 业 计算学部 学 号 120L021725 班 级 2003006 学 生 杨楠 指 导 ...
最新文章
- RPC 笔记(06)— socket 通信(多线程服务器)
- 聊聊成为大神路上的过程
- 如何在ASP.NetCore增加文件上传大小
- Web框架——Flask系列之Flask中的特殊变量和方法(十九)
- 人工智能在线特征系统中的数据存取技术
- vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言
- Linux 下安装nodejs
- 要想通过面试,MySQL的 Limit 子句底层原理你不可不知
- ctfshow-萌新-web11( 利用命令执行漏洞获取网站敏感文件)
- html5首页图标怎么除掉,移动端H5页面端如何除去input输入框的默认样式
- 研究生,怎么经济独立?
- 读《世界是数字的》笔记
- 2017-10-26 消息队列设计
- 微型计算机原理控制,微机原理与控制技术(试题).doc
- C++复合类型-引用变量
- 心电图分析软件_狼疮性心肌炎39例临床特点及预后分析
- C# DIRECTX INPUT 模拟 (鼠标玩FBA街机)
- 青青子美人之QQ美女找茬辅助工具c#源码
- python爬虫分析豆瓣中最新电影的影评
- JS 小写数字格式转大写格式