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.84
10^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 - 信息的存储的更多相关文章

  1. 【新阁教育】基于Log4Net实现日志信息双向存储(含源码)

    1.引言 在上位机开发中,日志记录是必不可少的,我们可以通过日志记录做日志分析及错误追踪.初学者会采用txt文本写入来实现日志保存,但是文本写入不是线程安全,当存在多个线程同时写入日志时,就会出现一些 ...

  2. SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历?

    二者的定义:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有 ...

  3. 使用HtmlAgilityPack爬取网站信息并存储到mysql

    前言:打算做一个药材价格查询的功能,但刚开始一点数据都没有靠自己找信息录入的话很麻烦的,所以只有先到其它网站抓取存到数据库再开始做这个了. HtmlAgilityPack在c#里应该很多人用吧,简单又 ...

  4. Android系统应用信息中存储和缓存的计算方法

    进行例如以下操作: 设置->应用->选择一个应用->应用信息 会到达例如以下界面: 能够看到这个应用占用的磁盘空间. 先说结果,这几项会计算哪些文件(夹). 1.应用,由三项相加组成 ...

  5. python爬取豌豆荚中的详细信息并存储到SQL Server中

    买了本书<精通Python网络爬虫>,看完了第6章,我感觉我好像可以干点什么:学的不多,其中的笔记我放到了GitHub上:https://github.com/NSGUF/PythonLe ...

  6. 数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储

    哈希表 解释 哈希表是一种根据关键码去寻找值的数据映射结构,该结构通过把关键码映射的位置去寻找存放值的地方 内存结构分析图 1.定义一个类为结点,存储的信息 2.定义链表的相关操作 3.定义一个数组存 ...

  7. PostgreSQL的schema信息,存储于何处

    查看schema信息: [pgsql@localhost bin]$ ./psql psql () Type "help" for help. pgsql=# create sch ...

  8. 六星经典CSAPP笔记(2)信息的操作和表示

    2.Representing and Manipulating Information 本章从二进制.字长.字节序,一直讲到布尔代数.位运算,最后无符号.有符号整数.浮点数的表示和运算.诚然有些地方的 ...

  9. Python抓取天气信息并存储原来这么简单

    我们计划抓取的数据:杭州的天气信息 实现数据抓取的逻辑:使用python 请求 URL,会返回对应的 HTML 信息,我们解析 html,获得自己需要的数据.(很简单的逻辑) 第一步:创建 Pytho ...

随机推荐

  1. 参加杭州 2019 AI Bootcamp有感与总结(2)

    接上篇 参加杭州 2019 AI Bootcamp有感与总结(1) - repeatedly - 博客园 午餐畅谈的收获 先感谢主办方提供的午餐,中午午休的时候,大家聊了很多,或者说主要是听大佬谈.聊 ...

  2. SpringBoot系列——Jackson序列化

    前言 Spring Boot提供了与三个JSON映射库的集成: Gson Jackson JSON-B Jackson是首选的默认库. 官网介绍: https://docs.spring.io/spr ...

  3. Pick of the Week'19 | 图数据库 Nebula 第 47 周看点-- insert 的二三事

    每周五 Nebula 为你播报每周看点,每周看点由本周大事件.用户问答.Nebula 产品动态和推荐阅读构成. 今天是 2019 年第 47 个工作周的周五,来和 Nebula 看看本周有什么图数据库 ...

  4. 基于Maven 的 Spring MVC

    Spring MVC 他是基于MVC的设计模式做出来的,他是Spring对Servlet的进一步的封装 MVC:Model  View  Controller 如何使用Spring MVC?(Spri ...

  5. JavaScript全栈教程

    这是小白的零基础JavaScript全栈教程. JavaScript是世界上最流行的脚本语言,因为你在电脑.手机.平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaSc ...

  6. fiddler教程:抓包带锁的怎么办?HTTPS抓包介绍。

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 介绍Fiddler的HTTPS抓包功能." 这里首先回答下标题中的疑问,fiddler抓包带锁的原因是HTTPS流量抓包功能开启, ...

  7. Oracle11G_R2中共享服务器模式和专用服务器模式参数解释及设置

    sys@MYTESTDB> show parameterNAME TYPE VALUE------------------------------------ ----------- ----- ...

  8. Centos7 下添加开机自启动服务和脚本

    1.添加开机自启服务 #设置jenkins服务为自启动服务 systemctl enable jenkins.service #启动jenkins服务 systemctl start jenkins. ...

  9. [Go] 轻量服务器框架基础TCP连接的抽象和封装

    对tcp连接部分以及与连接绑定的业务部分进行抽象和封装 主要是对连接的开启关闭和读写进行封装,抽象出接口,使用回调进行具体业务的绑定 zinterface/iconnection.go package ...

  10. MATLAB实例:散点密度图

    MATLAB实例:散点密度图 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ MATLAB绘制用颜色表示数据密度的散点图 数据来源:MATLAB中“fit ...