[CSAPP笔记][第二章信息的表示和处理]
信息的表示和处理
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中只支持有符号整数,
>>算数右移,>>>才是逻辑右移
- java中只支持有符号整数,
2.3 整数运算
2.3.1 无符号加法
x+y=(x+y)mod2^k溢出会舍去
阿贝尔群,群论。
2.3.2 补码加法
大多数计算机使用同样的机器指令来执行有符号和无符号之和。

x(有符号+)y= U2T(T2U(x+y) mod 2^w)
- 先计算x+y
- 将x+y转换为无符号类型z。
- p=z mod 2^w
- 附.(或者直接对x+y的二进制表示进行截断得到p)
- 将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笔记][第二章信息的表示和处理]的更多相关文章
- Android群英传笔记——第二章:Android开发工具新接触
Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...
- 《DOM Scripting》学习笔记-——第二章 js语法
<Dom Scripting>学习笔记 第二章 Javascript语法 本章内容: 1.语句. 2.变量和数组. 3.运算符. 4.条件语句和循环语句. 5.函数和对象. 语句(stat ...
- The Road to learn React书籍学习笔记(第二章)
The Road to learn React书籍学习笔记(第二章) 组件的内部状态 组件的内部状态也称为局部状态,允许保存.修改和删除在组件内部的属性,使用ES6类组件可以在构造函数中初始化组件的状 ...
- 深入理解 C 指针阅读笔记 -- 第二章
Chapter2.h #ifndef __CHAPTER_2_ #define __CHAPTER_2_ /*<深入理解C指针>学习笔记 -- 第二章*/ /* 内存泄露的两种形式 1.忘 ...
- [HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的“HT”
[HeadFrist-HTMLCSS学习笔记]第二章深入了解超文本:认识HTML中的"HT" 敲黑板!!! 创建HTML超链接 <a>链接文本(此处会有下划线,可以单击 ...
- 《图解HTTP》阅读笔记--第二章 简单的HTTP协议--第三章 HTTP报文信息
第二章.简单的HTTP协议HTTP协议:HTTP协议用于客户端(请求资源的一端)和服务器端(响应回复提供资源的一端)的通信,是一种无状态协议HTTP1.1默认TCP持久连接,管线化发送(并行发送多个 ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- [HeadFirst-JSPServlet学习笔记][第二章:高层概述]
第二章:高层体系结构 容器 1 什么是容器? servelet没有main()方法.它们受控于另一个Java应用,这个Java应用称为容器(Container) Tomcat就是这样一个容器.Web服 ...
- 《ProgrammingHive》阅读笔记-第二章
书本第二章的一些知识点,在cloudera-quickstart-vm-5.8.0-0上进行操作. 配置文件 配置在/etc/hive/conf/hive-site.xml文件里面,采用mysql作为 ...
随机推荐
- php图片上面写文字,输出图片
<?php /* param $image 图象资源 param size 字体大小 param angle 字体输出角度 param showX 输出位置x坐标 param showY 输出位 ...
- rhel Linux系统yum的配置
yum是一个很方便的linux系统软件管理工具,但是很多新手还是不会配置yum,下面详细的介绍下yum的配置方法,其实很简单. 1.首先确保系统ISO镜像已经成功挂载,可以用df -h命令查看.2.创 ...
- GCC下32位与64位机器类型变量所占字节数
GCC下32位与64位机器类型变量所占字节数 在C语言中,编译器一般根据自身硬件针对类型变量来选择合适的字节大小,下面列举一下在GCC编译器下32位机器与64位机器各个类型变量所占字节数目: C语言 ...
- C# typeof Gettype is as &拆箱 装箱
有时候,我们不想用值类型的值,就是想用一个引用..Net提供了一个名为装箱(boxing)的机制,它允许根据值类型来创建一个对象,然后使用对这个新对象的一个引用. 首先,回顾两个重要的事实,1.对于引 ...
- SQL从入门到基础 - 05 数据分组、Having语句
一.数据分组 1. 按照年龄进行分组统计各个年龄段的人数: Select FAge,count(*) from T_Employee group by FAge; 2. Group by子句必须放到w ...
- DG下手工处理v$archive_gap方法
从9i以后,oracle dataguard 备库一般都不需要手工处理丢失的日志,FAL自动会帮我们处理,下面通过个案例来讲下手工处理丢失的日志的方法: 1.在备库查询有哪些日志丢失,没应用到备库 S ...
- CSS学习笔记总结和技巧
跟叶老师说项目,他叫我写一个静态首页,看起来挺简单的,但是下手才发现在真的不会怎么下手啊,什么模型啊模块啊都不懂,写毛线啊!! 如图:页面下拉还有侧栏,中间内容等. 可是答应跟老师做了,不能怂啊,于是 ...
- QT VS2008未处理的异常: 0xC0000005
症状如图所示 出错代码段在第3行 QString dir = QFileDialog::getExistingDirectory(this, tr("Save file path&qu ...
- runtime error ?
程序运行时错误(运行时出错就是出现在程序运行过程中的),有很多种: 比如:溢出.内存泄露.死循.乱用指针.数组越界(数组开小了?).除以0错误.递归太深层(系统暴栈了)
- Spring boot构建基于rest的Web服务
一.介绍:使用Spring Boot我们可以很容易的创建一个可独立运行的Rest web服务,其中内嵌tomact,我们只需“run”就可以查看效果了. Spring Boot利用Gradle或Mav ...