CSAPP 2-1 - 信息的存储
0 基础概念及摘要
(1) 基础概念:
现代计算机存储和处理的信息以二进制信号表示 —— 0 | 1, 是非有无、非黑即白, 代表计算机是精确的.
计算机的表示法是 用有限数量的位(bit)来对一个数字编码, 如果数字太大难以表示时, 某些运算就会 溢出(overflow)**.
数字有三种表示形式:
a) 无符号(unsigned) 编码: 表示大于或等于0的数字;
b) 补码(two's-complement) 编码: 表示有符号整数(可以为正或为负的数字)的最常见方式;
c) 浮点数(floating-point) 编码: 表示实数的科学计数法的、以2为基数的版本.
整数运算和浮点数运算有不同的数学属性 —— 他们处理数字表示有限性的方式不同:
整数的表示虽然只能编码一个相对较小的数值范围, 但这种表示是精确的;
浮点数虽然可以编码一个较大的数值范围, 但这种表示只是近似的.
1 信息存储
大多数计算机使用8位(bit)的块, 或者 字节(byte), 作为最小的可寻址的内存单位, 而不是访问内存中单独的位.
内存的每个字节都由一个唯一的数字来标识 —— 这个数字称为 地址(address), 所有可能的地址的集合称为 虚拟地址空间(virtual address space) —— 逻辑概念、概念性映像.
1.1 十六进制表示法
一个字节由8位组成, 在二进制表示法中, 它的范围(值域)是 00000000 ~ 11111111, 对应十进制的 0~255.
为了避免二进制表示法的冗长, 同时兼顾方便与位之间的转换, 我们用 十六进制(hexaecimal) 来表示位模式, 一个字节的范围是 0x00 ~ 0xFF.
(1) 十六进制表示法:
| 十六进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 二进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 |
| 十六进制 | 8 | 9 | A | B | C | D | E | F |
| 二进制 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
| 十进制 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
说明: 在C语言中, 以0x或0X开头的数字常量被认为是十六进制的值.
字符‘A’ ~ ‘F’既可以是大写, 也可以是小写.
(2) 进制间的转换:
如0x7AF转换为十进制:
7 * 16 ^ 2 + 10 * 16 + 15 * 1 = 1967
其中7在第2位, A在第1位, F在第0位, 所以分别乘16^i次方.
而1967转换为十六进制:
1967 / 16 = 122 --- 余15
122 / 16 = 7 --- 余10
7 / 16 = 0 --- 余7
将最后的余数倒序排列, 得到的就是结果: 0x7AF.
1.2 字数据大小
每台计算机都由一个 字长(word size), 指明指针数据的标称大小(nominal size) —— 虚拟地址就是以这样的一个字来编码的, 所以字长决定了系统的虚拟地址空间的最大大小:
32位字长限制虚拟地址空间为4千兆字节(写作4GB), 刚超过410^9;
64位字长限制虚拟地址空间为16EB, 大约是1.8410^19.
基本C数据类型的典型大小:
有些数据类型的确切字节数依赖于程序是如何被编译的.
程序有“32位程序”或“64位程序”之分, 区别在于该程序是如何编译的, 而不是其运行的宿主机器类型.
ISO C99 引入了一类数据类型, 其大小是固定的, 不随编译器和机器的设置而变化, 其中就有数据类型
int32_t(4个字节)和int64_t(8个字节).使用确定大小的整数类型是开发人员准确控制数据表示的最佳途径. 开发人员应该力图使程序在不同的机器和编译器上可移植, 移植性的一个方面就是 使程序对不同数据类型的确切大小不敏感.
1.3 寻址和字节顺序
对跨越多字节的程序对象, 必须明确两个规则:
1) 对象的地址是什么?
2) 在内存中如何排列这些字节?
有些机器选择在内存中从最低有效字节到最高有效字节的顺序存储对象, 称为小端法(little endian);
有些机器则恰恰相反: 最高有效字节 -> 最低有效字节, 称为大端法(big endian).
以int类型的变量x为例, 它的十六进制值为 0x01234567, 地址范围0x100~0x103的字节顺序依赖于机器的类型:
扩展:
大多数Intel兼容机都只用小端模式, 而IBM和Oracle的大多数机器则用大端模式.但有些IBM和Oracle制造的PC使用的是Intel兼容的处理器, 因此使用小端法.
尽管有些较新的微处理器是双端法(bi-endian), 可实际情况是: 一旦选定了操作系统, 那么字节顺序也就随之固定下来, 大端法与小端法不能同时存在.
未完待续...
CSAPP 2-1 - 信息的存储的更多相关文章
- 【新阁教育】基于Log4Net实现日志信息双向存储(含源码)
1.引言 在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪.初学者会采用txt文本写入来实现日志保存,但是文本写入不是线程安全,当存在多个线程同时写入日志时,就会出现一些 ...
- SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历?
二者的定义:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有 ...
- 使用HtmlAgilityPack爬取网站信息并存储到mysql
前言:打算做一个药材价格查询的功能,但刚开始一点数据都没有靠自己找信息录入的话很麻烦的,所以只有先到其它网站抓取存到数据库再开始做这个了. HtmlAgilityPack在c#里应该很多人用吧,简单又 ...
- Android系统应用信息中存储和缓存的计算方法
进行例如以下操作: 设置->应用->选择一个应用->应用信息 会到达例如以下界面: 能够看到这个应用占用的磁盘空间. 先说结果,这几项会计算哪些文件(夹). 1.应用,由三项相加组成 ...
- python爬取豌豆荚中的详细信息并存储到SQL Server中
买了本书<精通Python网络爬虫>,看完了第6章,我感觉我好像可以干点什么:学的不多,其中的笔记我放到了GitHub上:https://github.com/NSGUF/PythonLe ...
- 数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
哈希表 解释 哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 内存结构分析图 1.定义一个类为结点,存储的信息 2.定义链表的相关操作 3.定义一个数组存 ...
- PostgreSQL的schema信息,存储于何处
查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...
- 六星经典CSAPP笔记(2)信息的操作和表示
2.Representing and Manipulating Information 本章从二进制.字长.字节序,一直讲到布尔代数.位运算,最后无符号.有符号整数.浮点数的表示和运算.诚然有些地方的 ...
- Python抓取天气信息并存储原来这么简单
我们计划抓取的数据:杭州的天气信息 实现数据抓取的逻辑:使用python 请求 URL,会返回对应的 HTML 信息,我们解析 html,获得自己需要的数据.(很简单的逻辑) 第一步:创建 Pytho ...
随机推荐
- Android BSearchEdit 搜索结果选择框
EditText搜索结果下拉框.自动or回调模式.可diy.使用超简便 (EditText search results drop-down box, auto or callback mode, d ...
- .NET机器学习 ML.NET 1.4预览版和模型生成器更新
ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架. ML.NET 还包括Model Builder (一个简单的UI工具)和 CLI ,使用自动机器学习(AutoML)构建自定义 ...
- Python小技巧:打印出来的文本文档中间有空格
问题描述: 在file.txt中存了内容如下 AAAAAA BBBBBB CCCCCC 然后采用python显示,发现显示出来的是这样的 A A A A A A B B B B B B C C C C ...
- 【翻译】全新16英寸MacBook Pro评测:开发人员的梦想成真
要问现在适合开发者用的笔记本,市面上还是有很多选择的,比如Dell的XPS系列,外星人系列(游戏也是杠杠滴),联想拯救者系列,还有形形色色的高配机型,价格也从几千到几万不等. 但是,笔吧评测室的猪哥说 ...
- JavaWeb 错误/异常时页面提示
经常我们会遇到发生页面404错误,服务器 500 异常,如果默认方式处理,则是将异常捕获之后跳到 Tomcat 缺省的异常页面,如下图所示.
- 使用 Flutter 开发 Mac 桌面应用
Flutter 可以开发 Mac,Linux,Windows 桌面,但是对于平台目前只能打对于的包,以及调试本平台的包. 切换到 master 分支 首先必须切换到 master 分支.我之前在 de ...
- docker可视化工具Portainer部署与汉化
为了更好的观察Docker运行状态,我们采用Portainer工具进行可视化,下面是部署过程总结: 环境: Liunx:CentOS Linux release 7.6.1810 (Core) Doc ...
- MySQL 学习笔记 (一)
1.InnoDB and Online DDL ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE; ...
- "(error during evaluation)" computed
在vue-cli搭建的去哪网app项目中使用了 computed 计算属性 computed计算属性在chrome插件中的 vue devtools 插件中报错 应该显示出来 computed 属 ...
- LVS的工作模式介绍和NAT模式&DR模式实验步骤
一:LVS介绍 二.LVS的NAT和DR模式的实验及配置步骤 一.LVS的简单介绍 linux virtual server 简单来讲lvs是一段内核代码 类似于netfilter本身是一框架但不提供 ...