信息的表示和处理

2.1 信息存储

  • 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器
  • 存储器的每个字节由一个唯一的数字表示,称为它的地址
  • 所有可能地址的集合称为虚拟地址空间

2.1.1 十六进制表示法

python 中十六进制的转变方法

a=;
print(hex(a)) //print:0xf

2.1.2 字

  • 字长决定虚拟地址空间的最大大小
  • 32位的是4G(2^32)

2.1.3 数据大小

  • char *使用了机器的全字长

2.1.4 寻址和字节顺序

  • 小端法:大多数Intel兼容机规则(现在最为常用)

    • 高位放高地址
  • 大端法:IBM 和Sun Microsystems

    • 高位放低地址
  • printf(“%.2x “)解析

    摘自K&R《C程序设计语言》:
    点号,用语分隔字段宽度和精度
    表示精度的数。对于字符串,它指定打印的字符的最大个数;对于e、E或f转换,它指
    定打印的小数点后的数字位数;对于g或G转换,它指定打印的有效数字位数;对于整型数,它指定打印的数字位数(必要时可填充位0以达到要求的宽度)

2.1.5 表示字符串

  • 在使用ASCII码作为字符码的任何系统都会表示相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性

  • Java使用Unicode 来表示字符串。对于C语言也有支持Unicode的程序库

2.1.6 表示代码

即使是相同的一段代码,在不同的机器类型使用不同,不兼容的指令,因此二进制代码是不兼容的。

2.1.7 布尔代数简介

很简单

  • 位向量常用于集合的表述(状态压缩常用)

2.1.8 C语言的位级运算

ACM玩的很多了,就不说了

2.1.9 C语言的逻辑运算

  • || && 惰性求值

2.1.10 C语言的移位运算

  • 逻辑右移

    • 往左边补k个0
  • 算术右移

    • 往左边补k个最高有效位的值
    • 对有符号运算有奇效

潜在问题

  • 对于无符号数据,右移必须是逻辑的。
  • 对于有符号数据,逻辑,算术都可以。
    • 几乎所有编译器对有符号使用算数右移
    • 许多程序员也假设使用算数右移
    • 可能会存在潜在的兼容性问题

2.2 整数表示

2.2.1 整数数据类型

  • 有符号
  • 无符号
  • 负数比正数大一(有一个-0被表示为最小的那个负数)

2.2.2 无符号数的编码

  • 性质:双射

2.2.3 补码编码

用这种方式理解补码,是一种新的不错的思路

  • 很容易算出范围。不用思考转成原码
  • 双射,规则没有特例,很容易看出0不能表示两种。

补码,反码

2.2.5 C语言中的有符号数和无符号数

  • 默认为有符号,如果需要无符号某尾+U,例:12345U

2.2.6 扩展一个数字的位表示

  • 对于一个无符号数转为更大的数据类型

    • 只需要简单地在表示的开头添加0,这种运算称为零扩展
  • 对于有符号的数,即补码

    • 进行符号扩展(sign extension),就是添加最高有效位的值
  • 对比逻辑右移,和算术右移

2.2.7 截断数字

  • 截断一个数到k位,即舍去w-k的高位。

  • 对于无符号数截断x它到k位的结果相当于

    • B2U([Xk-1,Xk-2,….x0])=B2U([Xw-1,Xw-2…x0]) mod 2^k
  • 对于有符号的数x。

    • 截断的时候还是当做无符号的数看
    • B2T([Xk-1,Xk-2,….x0])=U2T(B2U([Xw-1,Xw-2…x0]) mod 2^k
      )

建议

  • 在大多数情况下使用有符号整数

    • java中只支持有符号整数,>>算数右移,>>>才是逻辑右移

2.3 整数运算

2.3.1 无符号加法

  • x+y = (x+y) mod 2^k
  • 溢出会舍去

  • 阿贝尔群,群论。

2.3.2 补码加法

  • 大多数计算机使用同样的机器指令来执行有符号和无符号之和。

  • x(有符号+)y= U2T(T2U(x+y) mod 2^w)

      1. 先计算x+y
      1. 将x+y转换为无符号类型z。
      1. p=z mod 2^w
    • 附.(或者直接对x+y的二进制表示进行截断得到p)
      1. 将p用有符号类型表示
  • 正溢出,正常,负溢出。

2.3.3 补码的非

  • 因为正负区间的不一致
  • 所以最小的那个负数的相反数逆元还是最小的那个负数。

  • 对于任意整数x-x~x+1得到的结果完全一样。

2.3.4 无符号乘法

  • 只取低w位表示的值,其余截断

2.3.5 补码乘法

  • 对于无符号和补码乘法,乘法运算的位级表示都是一样的,是同一条指令。

  • 无符号和补码相乘出来的两个数的低W位 永远相等。证明见书。

2.3.6 乘常数

  • 因为乘法速度太慢,机器可能会用(加法,减法,移位)来代替乘法。

2.3.7 除以2的幂

  • 对于无符号类型或整数,直接右移不会有任何问题。

  • 对于负数,最后的值为-48.3,会舍入成 -49,而不是-48.

    • 解决方法是偏置
    • 原理:
    • C语言

      (x< ? (x+(<<k)-):x)>>k
      等价于x/pwr2k ,pwr2k=^k

2.4 浮点数

之后看,现在先过别的。

[CSAPP笔记][第二章信息的表示和处理]的更多相关文章

  1. Android群英传笔记——第二章:Android开发工具新接触

    Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...

  2. 《DOM Scripting》学习笔记-——第二章 js语法

    <Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...

  3. The Road to learn React书籍学习笔记(第二章)

    The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...

  4. 深入理解 C 指针阅读笔记 -- 第二章

    Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...

  5. [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”

    [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...

  6. 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息

     第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...

  7. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  8. [HeadFirst-JSPServlet学习笔记][第二章:高层概述]

    第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...

  9. 《ProgrammingHive》阅读笔记-第二章

    书本第二章的一些知识点,在cloudera-quickstart-vm-5.8.0-0上进行操作. 配置文件 配置在/etc/hive/conf/hive-site.xml文件里面,采用mysql作为 ...

随机推荐

  1. css如何实现背景透明,文字不透明?

    之前做了个半透明弹层,但设置背景半透明时,子元素包含的字体及其它元素也都变成了半透明.对opacity这个属性认识的不透彻,在这里做一些总结,方便以后使用.   背景透明,文字不透明的解决方法:   ...

  2. java下io文件切割合并功能

    package cn.stat.p1.file; import java.io.File; import java.io.FileInputStream; import java.io.FileNot ...

  3. 有几数组表单,js怎么获得数组并动态相加输出到文本框

    有几数组表单,js如何获得数组并动态相加输出到文本框<input   name= "fee1[] "> <input   name= "fee2[] & ...

  4. [Leetcode][015] 3Sum (Java)

    题目在这里: https://leetcode.com/problems/3sum/ [标签] Array; Two Pointers [个人分析] 老实交待,这个题卡半天,第一次做不会,抄别人的.过 ...

  5. sass转换为css

    sass安装的方法参考官网:http://www.w3cplus.com/sassguide/ SASS文件转换为CSS文件的方法: 首先输出 F: 代表找到F盘 : 然后输出cd sass 代表找到 ...

  6. jQuery Lazy Load 图片延迟加载

    基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery ...

  7. 百度PHP实习一面面试题-算法-二维有序矩阵的查找

    题目描述 有一个二维矩阵,每一行的元素,从左到右保持严格递增,每一列的元素,从上到下保持严格递增.查找给定元素elem,返回NULL或元素位置. 1 3 7 15 16 2 5 8 17 19 3 6 ...

  8. ./configure 时候报错c++ 编译器不能执行

    ./configure时报错:configure: error: C++ compiler cannot create executables .哎,今天重装测试服务器上的系统,设置好IP可以远程访问 ...

  9. [python]百度语音rest api

    百度语音识别提供的api范例只有java, c, php. 如果使用Python, 需要注意: 语音文件长度是指bytes大小 可以通过len(file.read())获得 使用requests.po ...

  10. UCOS 内存管理理解 创建任务

    OS_MEM   *OSMemCreate (void *addr, INT32U nblks, INT32U blksize, INT8U *err)   { ................... ...