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. deinit 没执行

    写了一个自定义的UIView,其中包含代理       然后设置UIViewController为此UIView的代理       结果UIViewController里的deinit没执行,导致内存 ...

  2. 使用 SQL 服务器时,"评估期已过期"错误消息

    当打开sql server2008企业管理器的时候,出现报错“评估期已过.有关如何升级的测试版软件的信息.....” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso ...

  3. 【每天一题】LeetCode 0026. 删除排序数组中的重复项

    开源地址:https://github.com/jiauzhang/algorithms 题目描述 /* * https://leetcode-cn.com/problems/remove-dupli ...

  4. VUE,基于vue-cli搭建创建vue项目

    前提:必须安装node.js,官方地址:https://nodejs.org/en/ 然后安装vue-cli 安装方式:cmd命令行安装:打开cmd命令符输入进行全局安装脚手架:npm install ...

  5. 龙芯(mips64)电脑安装NodeJS

    背景 龙芯是国产的cpu,采用是mips架构,就类似大家熟知的x86.arm. 最近在一台龙芯电脑(系统是中兴新支点,Linux)上调试前端应用(electron),于是就需要安装NodeJS. 但是 ...

  6. MySQL 社区版 安装小记

    根据刘铁猛老师的教程,自己折腾一下 1. 安装包准备 在Windows10 64bit上安装,故需要准备vc++ 2013和2015的Redistributable的包,搜索即有,无需细说. 示例数据 ...

  7. Android框架式编程之ViewModel

    一.ViewModel介绍 ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据.ViewModel中数据会一直存活即使 Activity Configuration发生变 ...

  8. Go语言nil:空值/零值

    在 Go 语言中,布尔类型的零值(初始值)为 false,数值类型的零值为 0,字符串类型的零值为空字符串"",而指针.切片.映射.通道.函数和接口的零值则是 nil. nil 是 ...

  9. 【好书推荐】《剑指Offer》之硬技能(编程题12~16)

    本文例子完整源码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sword <[好书推荐]& ...

  10. 【Java基础】String 相关知识点总结

    String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final ...