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 ...
随机推荐
- python基础之字符串讲解(下)
7.swapspace 这个命令是让大小写翻转 s = 'qwerQ' s3 = s.swapcase() print(s3) 8.title 每个隔开(特殊字符或者数字)的单词首字母大写 s = ' ...
- springcloud配置中心
SpringCloud Config简介 Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持 ...
- SpringCloud断路器(Hystrix)
一.为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自身的原因,服务并不能保 ...
- 提升代码幸福度,五个技巧减少js开发中的if else语句
壹 ❀ 引 在JavaScript开发中,条件判断语句的使用频率是极高的,而对于条件判断简单易读的if else应该都是大家的首选.可是代码写的久了,我们总是希望自己的代码看着能更为简洁规范(逼格更 ...
- 第2章:C++泛型机制的基石:数据类型表——《C++泛型:STL原理和应用》读书笔记整理
第二章:C++泛型机制的基石--数据类型表 2.1 类模板的公有数据类型成员 2.1.1 类的数据类型成员 C++类中不仅可以定义数据成员和函数成员,而且还可以定义数据类型成员.在泛型设计中,类的 ...
- Spring cloud Feign 深度学习与应用
简介 Spring Cloud Feign是一个声明式的Web Service客户端,它的目的就是让Web Service调用更加简单.Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解 ...
- C#DataTable转List<T>互转
using System; using System.Collections.Generic; using System.Data; using System.Reflection; namespac ...
- LinqDB 查询数据库
LinqDB数据库查询数据,还是很方便的. 1. 添加Entity数据实体类 方便之后映射操作 /// <summary> /// 课件 /// </summary> [Dat ...
- 2019年创意可爱卡通小清新教育课件培训PPT模板
模版来源:http://ppt.dede58.com/jiaoxuekejian/26791.html
- vue 无限滚动问题
如今web开发中,无限加载是必需的一项功能,尤其是在移动端开发中,一个列表往往默认只加载10条,想看更多只能逐渐往下翻页.那么今天就看看如何在Vue-Cli中实现这个功能. 当前找到两个插件 1 el ...