CSAPP 第二章 信息的表示和处理

【创作赢红包】Gurobi学术版证书更新与Python环境配置全攻略 本文详细解析了Gurobi学术版证书过期后的完整更新流程与Python环境配置方法。从彻底清理旧版残留、手把手注册获取新许可证,到软件安装、证书激活,最后重点讲解如何将gurobipy接口正确配置到Python的site-packages目录,并提供了常见问题排查方案,帮助用户高效解决证书与配置难题。 阅读详情

标签: CSAPP


本章研究三种最重要的数字表示:无符号、补码和浮点数。

1. 信息存储

  • 大多数计算机使用 8 位的块,或者 字节 作为最小的可寻址的内存单位,而不是访问内存中单独的位。
  • 机器级程序将内存视为一个非常大的字节数组,称为 虚拟地址。
  • 内存的每一个字节都由一个数字来标识,称为它的 地址。
  • 所有可能地址的集合就称为 虚拟地址空间。

指针有两个方面:指和类型。指表示某个对象的位置,而类型表示那个位置上所存储对象的类型。

1.1 十六进制

  • 用 ‘0’ ~ ‘9’ 和 ‘A’ ~ ‘F’ 表示 0 ~ 15,其中 ‘A’ ~ ‘F’ 可以是大写也可以是小写。
  • 在 C 语言中,用 0x 或者 0X 开头表示十六进制的值。

1.2 字数据大小

  • 每台计算机都有一个 字长,指明指针数据的标称大小。
  • 虚拟地址是以一个字来编址的,所以字长决定 虚拟地址空间的最大大小。比如对一个字长为 w 位的机器来说,虚拟地址范围为 0 ~ 2w−1,程序最多访问 2w 个字节。
  1. 我们将程序称为“32位程序”或“64位程序”时,区别在于该程序是如何编译的,而不是其运行的机器类型。

  2. 为避免由于编译器的不同带来的数据类型大小的改变,强烈建议用 int32_t 和 int64_t 代替 int,这样可以准确控制数据表示。

1.3 寻址和字节顺序

  • 大端法(Big endian):最高有效字节在最前面。
  • 小端法(Little endian):最低有效字节在最前面。
  • 假设一个 int 类型的数,地址为 0x100,值为 0x1234567,则
    大端法和小端法

1.4 C语言中的几种运算

1.4.1 位级运算

按位进行布尔运算。

  • | : 或 运算
  • & : 与 运算
  • ~ : 非 运算(按位取反)
  • ^ : 异或 运算
1.4.2 逻辑运算
  • 逻辑运算中,所有非零的参数表示 TRUE,参数 0 表示 FALSE
  • || : 或(OR)
  • && : 与(AND)
  • ! : 非(NOT)

逻辑运算从左向右求值,如果已经能确定表达式的值了,就不会继续往下求值。

1.4.3 移位运算
  • 左移: 左移 k 位就是丢弃最高的 k 位,并在右端补 k 个 0。
  • 右移:右移 k 位就是丢弃最低的 k 位,并
    • 逻辑右移:在左端补 k 个 0
    • 算术右移:在左端补 k 个 最高有效位的值。主要针对有符号整数的运算。
  1. C 语言没有明确规定有符号数应该使用哪种类型的右移。所有会遇到可移植性的问题。

  2. 对于一个 w 位组成的数据类型,移位 k 位,当 k>w 时,在很多机器上,最终的位移量是 k mod w 位,Java 中按照这个标准进行位移,但是,C 语言对此不做任何保证,所以应该保持位移量小于待位移值的位数。

2. 整数表示

  • 整数分为 无符号数 和 有符号数。无符号数一般采用原码表示,有符号数一般采用补码表示。

    1. 采用补码表示导致了取值范围的 不对称————负数的范围比正数的范围大 1.
    2. C 语言并没有要求用补码形式表示有符号整数,但是几乎所有的机器都是这么做的。
  • 强制类型转换: 结果保持位值不变,只是改变了这些位的解释方式。

    当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么 C 语言会隐式地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。

  • 数字的位扩展:整数从较小的类型转换为较大的类型,同时又保持数值大小不变。

    • 扩展 无符号数
      零扩展:简单的在表示的开头补零
    • 扩展 补码数
      符号扩展:在表示中添加最高有效位的值。
  • 截断数字:与位扩展相反,截断是将大类型的数转换为小类型的,但是不能保证数的大小不变。
    将一个 w 位的数字 x 截断为 k 位的 y 时:

    • x 为 无符号数
      y=x mod 2k
    • x 为 补码数
      将 x 看做无符号数截断以后,将截断的数转化为补码(即将最高位转换为符号位)。

    由于有符号数到无符号数的隐式转换会导致一些难以察觉的错误,所以新手程序员尽量少用无符号数。

    3. 整数运算

    3.1 无符号加法

    • 由于运算精度的问题,两个数相加后可能会超出最大可表示的范围,因此实际上,无符号数的加法是一种取模运算。
      对于 w 位的 x 和 y 来说 : x+y=(x+y) mod 2w
    • 判断溢出:只需判断 和 是否比任意一个 加数 要小即可。

    3.2 补码加法

    • 补码的加法在位级表示上与无符号的加法一样,所以补码的加法就是将补码看成无符号数进行加法运算,然后将结果转换为补码表示。
    • 判断溢出:补码的溢出有两种。设 s=x+y
      • 正溢出:当且仅当 x>0,y>0,但s<=0 时。
      • 负溢出:当且仅当 x<0,y<0,但s>=0 时

    3.3 补码的非

    • 非 即加法逆元,在这里是相加为零的两个数互为 逆元。
    • 一般来说,非 就是求其负数,但是由于补码表示的不对称性,负数的最小值没有对应的正数是其逆元,故负数的最小值的逆元就是其本身。

    3.4 无符号乘法

    • 与无符号加法类似,结果需要截断,即取模。
    • 对于 w 位的 x 和 y 来说 : x∗y=(x∗y) mod 2w

    3.5 补码乘法

    • 与补码加法一样,补码乘法在位级表示上与无符号乘法法一致,但是仅限与截断后的结果。也就是说,补码乘法只要将补码看成无符号数进行运算,然后将截断后的值转换为补码表示即可。

    4. 浮点数(IEEE 标准)

    • IEEE 浮点标准用 V=(−1)s∗M∗2E 的形式来表示一个数:

      • 符号 s:决定这个数是正数(s = 0)还是负数(s = 1),对于数值 0 的符号位作为特殊情况处理。用 1 位二进制数表示。
      • 尾数 M:M是一个二进制小数。用 n 位二进制数表示。位模式是 f=fn−1...f1f0。
      • 阶码 E:E 的作用是对浮点数加权这个权重是 2 的 E 次幂(可能是负数)。用 k 位二进制数表示。位模式是 e=ek−1...e1e0。
      • 在单精度浮点数(32位表示)中,k=8,n=23。在双精度浮点数(64位表示)中,k=11,n=52。
    • IEEE 表示的三种情况:

      1. 规格化的值
        当 e 的位模式不全为 0,也不全为 1 时,就属于规格化表示。此时,
        • E=e−Bias。其中,Bias=2k−1−1
        • M=1+f
    • 非规格化的值
      当阶码域全为 0 时,就属于这种情况。此时,
      • E=1−Bias
      • M=f
    • 特殊值
      当阶码域全为 1 时,属于这种情况。此时:
      • 当小数域全为 0 时,表示无穷,s=0 表示正无穷,s=1 时表示负无穷。
      • 当小数域非零时,表示 NaN,即“Not a Number”。

    5. 小结

    计算机将信息编码为 位(比特),通常组织成 字节 序列。有不同的编码方式来表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节顺序时使用不同的约定。

    C 语言的设计可以包容多种不同字长和数字编码的实现。64 位字长的机器逐渐普及,并正在取代统治市场长达 30 多年的 32 位机器。由于 64 位机器也可以运行 32 位机器编译的程序,我们的重点就放在区分 32 位和 64 位程序,而不是机器本身。64 位程序的优势是可以突破 32 位程序具有的 4GB 地址限制。

    大多数机器对整数使用补码编码,而对浮点数使用 IEEE 标准 754 编码。在位级上理解这些编码,并且理解算术运算的数学特性,对于想使编写的程序能在全部数值范围上正确运行的程序员来说,是很重要的。

    在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数 C 语言实现遵循的原则是底层的位模式不变。C 语言隐式的强制类型转换会出现许多程序员无法预计的结果,常常导致程序错误。

    由于编码的长度有限 与传统整数和实数运算相比,计算机运算具有非常不同的属性。当超出表示范围时,有限长度能够引起数值溢出。当浮点数非常接近于 0.0,从而转换成 0 时,也会下溢。

    和大多数其他程序语言一样,C语言实现的有限整数运算和真实的整数运算相比,有一些特殊的属性。例如,由于溢出,表达式 x∗x 能够得出负数。但是,无符号数和补码运算都满足整数运算的许多其他属性,包括结合律、交换律和分配律。这就允许编译器做很多优化。

    浮点表示通过将数字编码为 x∗2y 的形式来近似地表示实数。最常见的浮点表示方法是由 IEEE 标准 754 定义的。它提供了几种不同的精度,最常见的是单精度(32位)和双精度(64 位)。 IEEE 浮点数也能表示特殊值。

    必须非常小心的使用浮点运算,因为浮点运算只有有限的范围和精度,而且并不遵守普遍的算术属性,比如结合性。


Windows远程桌面开发之九-虚拟显示器(Windows 10 Indirect Display 虚拟显示器驱动开发) by fanxiushu 2019-06-24 转载或引用请注明原始作者。 这里与远程桌面关系不是太大,但这个部分是xdisp_virt远程控制程序的实现多显示器桌面扩展的子功能,因此也归为远程桌面开发一类。 这篇文章与之前发布的... 阅读详情

相关推荐

Python-uiautomator2保姆级安装指南:从环境配置到设备连接全流程

本文提供Python-uiautomator2的保姆级安装指南,涵盖从环境配置到设备连接的全流程。详细介绍了Python 3.6+、ADB工具等核心组件的准备,以及uiautomator2的安装和设备端服务初始化步骤,帮助开发者快速搭建Android自动化测试环境,避免常见问题。

nnn11的博客 937

CSAPP 第二章

我们研究三种最重要的数字表示:无符号,补码以及浮点数。 2.1 信息存储:大多数计算机使用8位的块(一个字节)作为最小可寻址存储器单元。机器级别的程序将存储器看作一个非常大的字节数组,称为虚拟内存。存储器每个字节都由唯一的数组(地址)标识,所有地址的集合称为虚拟地址空间。(32位操作系统支持的最大地址空间是2的32次方字节,即4G,同理,64位支持2的64次方字节,一个地址对应一个字节)  

读书,反思 546

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6035

[CSAPP笔记][第二章信息的表示和处理]

信息的表示和处理 2.1 信息存储 机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器。 存储器的每个字节由一个唯一的数字表示,称为它的地址 所有可能地址的集合称为虚拟地址空间 2.1.1 十六进制表示法 python 中十六进制的转变方法 a=15; print(hex(a)) //print:0xf 2.1.2 字 字长决定虚拟地...

weixin_34360651的博客 277

Window系统下搭建GIT本地服务器

这是一篇在window下搭建git本地服务器的教程,带你一步步搭建出本地的git服务器。

qwer971211的博客 2万+

ISP调试工程师相关面试问题_001

Qualcomm、MTK等ISP pipeline的框架原理及算法原理,还有调试经验。

notgoodenouf的博客 3544

《深入理解计算机系统》CSAPP第二章知识点归纳(看完一遍复习专用)

csapp第二章知识点归纳——这个是本人学习csapp的章节归纳啦,可以用来复习和大致了解书本内容,欢迎各位阅读o(* ̄▽ ̄*)ブ(定期更新)

wangjialei1998的博客 2330

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

【CSAPP 读书笔记】第二章:信息的表示和处理

本文深入探讨了计算机系统中信息的表示与处理机制。主要内容包括:1) 计算机使用二进制存储信息,通过十六进制提高可读性;2) 大小端法对多字节数据的存储方式影响,通过代码示例展示小端法的实际应用;3) 整数表示方法(无符号编码和补码编码)及其转换规则;4) 类型转换时可能出现的意外情况,如无符号数比较时的隐式转换问题。文章通过理论讲解和C语言代码示例,揭示了底层数据表示的奥秘,帮助读者理解计算机处理信息的本质机制。

分享一些嵌入式Linux相关知识 1000

手把手教你学Simulink——基于经典PID控制的电机系统场景实例:步进电机PID位置控制系统的实现

步进电机(Stepper Motor)是一种将电脉冲信号转化为角位移的执行元件,具有结构简单、控制方便、定位精度高等优点,广泛应用于数控机床、机器人、打印机、3D打印机等需要精确定位的场合。传统的步进电机多采用开环控制,但在高速或负载变化较大的情况下容易出现丢步、振荡等问题。为提高控制精度与响应性能,闭环PID控制被引入步进电机的位置控制中,通过编码器或旋转变压器等反馈装置,实现高精度、高稳定性的位置控制。本教程将带你使用构建一个基于PID控制的步进电机位置控制系统仿真模型步进电机建模。

MHD0815的博客 9687

SAP 采购申请、采购订单的审批策略

采购申请、采购订单的审批策略 采购申请审批 PR审批可以分为:含分类、无分类 1、无分类PR审批: A、后台配置: 设置批准代码(批准代码可以设置多级审批): 发布批准标识使用系统已有的 “2 询价/采购订单”: 新建采购申请审批策略Z1(仅设置1级审批,一共可以设置8级审......

willieyuan的博客 2万+

CSAPP复习笔记:第二章 信息的表示和处理

我们在计算机系统中研究三种最重要的数字表示: 无符号(unsigned)编码基于传统的二进制表示法,表示大于等于零的数字。 补码编码是表示有符号整数最常见的方式,可以表示正数和负数。 浮点数编码是表示实数的科学计数法。 我们通过掌握计算机编码数值的二进制形式,在之后的学习中会更容易理解机器级代码。 2.1信息存储 ...............

zhousiyuan0515的博客 1147

Java 类与对象 -- Java 语言的类与对象、构造器、static、final、包和 JAR

本篇文章我们将深入了解 Java 语言中的类与对象,探讨构造器、`static`、`final`、包和 JAR 文件。这些概念是面向对象编程的核心,对于理解和掌握 Java 至关重要。

栗筝i的博客 5033

CSAPP笔记——第二章计算机中信息的表示和处理

计算机中的信息存储与表示全过程、无符号整数、有符号整数的加减乘除运算等

做一个善良的人,做好自己的事,如果愿意,再发一份光。 1213

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

CSAPP-第二章信息的表示和处理

2.1信息存储

qq_43010954的博客 390

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

csapp 第二章信息的表示和处理

如果我们学习过c语音可以知道,浮点数是有精度的,也就是说我们的数都是由无限逼近的数进行取舍的,也就是说,举个例子:5/2=2.5,在我们的计算机中这个2.5并不是准确的2.5,可能是2.49876765.有些时候可能我们会纳闷,有些时候计算机是进行的四舍五入,有些时候我们的计算机又进行的是直接抹除小数后面位数。二进制中,末尾为0的数为偶数。我们应该知道的是,在不同的计算机上,我们的一些数据的大小存储是不同的,比如,我们熟悉的int ,在不同的计算机上有的是占4个字节(大多数),有的计算机上占的是2个字节。

qq_54894802的博客 128

CSAPP阅读笔记——第二章:信息的表示和处理

CSAPP阅读笔记——第二章

Pulp Fiction 785

CSAPP第二章-信息的表示和处理

信息的表示和处理绪对计算机底层数的位形式表示和运算有疑问的同学,非常推荐一读。各种细节问题,拨云见日,豁然开朗。信息存储 数字表示,分三种情况: 无符号整数,普通二进制形式 有符号整数,补码。 浮点数,IEEE 754标准。最小可寻址存储器单位:字节(byte),8个二进制位(bit),2个16进制字符表示。 16进制记忆小技巧,记住A-10, C-12,F-15就可以了。 字长 计算机

788

CSAPP(第二章 信息的表示和处理,附上datalab解析

(2)检查前16位,若存在1,则至少需要16位,x>>16,否则x>>0。(1)将负数转换为其按位取反值。

2301_79140115的博客 838

【学习笔记】CSAPP-第二章 信息的表示和处理

布尔代数(Boolean algebra)逻辑值TRUE/FALSE编码为二进制值1/0。否与或异或布尔运算命题逻辑⌝\urcorner┐∧\wedge∧∨\vee∨⊕\oplus⊕【拓展】异或的一些运算法则归零律:a^a = 0恒等律:a^0 = a交换律:a^b = b^a结合律:a^b^c = a^(b^c) = (a^b)^c。

雨儿的博客 398

csapp第二章 --- 信息的表示和处理

认识计算机的计算逻辑,重点为IEEE规则对于浮点数的重要性

竹杖芒鞋轻声马 462

CSAPP笔记(第二章 信息的表示和处理)-01

第二章内容为p58~p124 概要 无符号整数(unsigned)基于传统的二进制编码, 补码(two's-complement)是表示有符号整数最常见的方式, 浮点数(floating-point)是表示实数的科学计数法基数为2的版本 以有限位的方式表示数字, 在计算时时常会超出表示范围(即溢出overflow), 这经常会导致系统安全漏洞, 遭受黑客攻击 整数的表示范围较小, 是精...

weixin_30315905的博客 207

CSAPP笔记(第二章 信息的表示和处理)-02

第二章内容为p58~p124 概要 本章的后半部分讲了整数的二进制(原码和补码)的四则运算, 以及浮点数的四则运算. 整数的二进制四则运算 w位的2个二进制数相加减, 结果的范围需要w+1位来存储, 而实际中位数是固定的, 结果超出w位表达的范围产生"溢出", 计算机需要处理这种"溢出", 就称为本部分的主要内容. 加减法 w位无符号数加法可能导致溢出, 如溢出, \(x +_{w}^...

weixin_30315905的博客 172

《深入理解计算机系统》(CSAPP)读书笔记 —— 第二章 信息的表示和处理

本章主要研究了计算机中无符号数,补码,浮点数的编码方式,通过研究数字的实际编码方式,我们能够了解计算机中不同类型的数据可表示的值的范围,不同算术运算的属性,可以知道计算机是如何处理数据溢出的。了解计算机的编码方式,对于我们写出可以跨越不同机器,不同操作系统和编译器组合的代码具有重要的帮助。 文章目录信息存储为什么会有二进制?二进制有什么含义和优势?计算机的三种编码方式整数&浮点数虚拟内存&虚拟地址空间二进制&十进制&十六进制二进制转十六进制(分组转换)十进制转十六进制虚拟.

嵌入式与Linux那些事的博客 9329
上一篇: CSAPP 第一章 计算机系统漫游
下一篇: 计算机网络 自顶向下方法 第二章 应用层
MemoryD
博客等级 码龄10年 64粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值