《深入理解计算机系统》2.3整数的运算

无符号加法

对于w位数字,它的取值范围是(0,2w?1)。如果两个这样的数字相加,其结果的取值范围将为(0,2w+1)。那么对于固定字长的数据类型,将可能丢弃最高位

无符号加法等价于计算和再模上2w

例如
x=9:[1001]
y=12:[1100]
其和为21:[10101]
由于字长固定,故丢弃最高位:[0101]即5
以上等价于(9+12)% 24 =5

显然如果s=x+y当((s<x)||(s<y))时,可以说计算溢出。此时表达式为

s=x+y-2w

加法逆元

补码加法

补码加法实际是把补码变无符号,再用无符号加法,结果再变成补码。

这个过程也会有超出取值范围的情况

下面是数据溢出时的情况
一个w位的补码取值范围:?2w?1,2w?1

图左边:是两个w位补码相加可能的取值范围,图右边:对应于左边取值范围结果的取值范围

最后公式:

补码的非

公式:

补码非的位表示
有两种方法能算出补码的非

  • 每一位取反再+1
  • 最右边的1的左边全取反

无符号乘法

乘法会溢出

补码乘法

补码乘法也会溢出

乘法结果截断后与无符号相同
说明机器可以用一条指令进行无符号和补码的乘法

乘以常数

乘法运算可能要10个左右的时钟周期,位移运算和加减法运算只用一个时钟周期
所以对于乘以常数运算,计算机采用位移和加法代替
比如

X*14
等价于(x<<3)+(x<<2)+(x<<1)

对于X*K(K为常数)
编译器会把K变为[000000 1111 000 111 ]
把连续的1归为一组
 上述的例子有两组

分别是0~2的1,6~9的1

可以使用形式计算

  • ((X<<9)+(x<<8)+(x<<7)+(x<<6))+((x<<2)+(x<<1)+(x<<0))
  • ((X<<10)-(X<<6))+((X<<3)+(X<<0))

原文

除以2的幂

补码使用算术右移
无符号使用逻辑右移

x/2^n===>x>>n
对于x>=0,y>0通常的计算结果是

但是对于负数的位移,舍去小数的时候将产生不想要的结果

上图舍入后结果是向下取整的,但是我们要的是向0取整的

所以为了得到零舍入的结果,在运算前需要对被除数进行"偏置"

总结

来自为知笔记(Wiz)

时间: 2024-10-16 17:25:57

《深入理解计算机系统》2.3整数的运算的相关文章

深入理解计算机系统(2.6)---二进制整数的乘、除法运算(重要)【困难度高】

本文转载地址:http://www.cnblogs.com/zuoxiaolong/p/computer10.html 2.5我们着重介绍了二进制整数的加.减运算,本次我们继续介绍乘.除运算. 引言 运算一直是程序运行当中一个重要的环节,而在二进制的运算过程当中,加法运算又是重中之重,它基本上奠定了二进制运算的基础.因为无论是减法还是乘法,都可以由加法运算来替代,唯有除法不能由加法替代. 了解计算机运算的规律,可以有助于我们理解很多程序代码上无法理解的内容.比如上章提到的溢出问题,在了解了加法运

【转】《深入理解计算机系统》C程序中常见的内存操作有关的典型编程错误

原文地址:http://blog.csdn.net/slvher/article/details/9150597 对C/C++程序员来说,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的模块跑起来后才出现内存崩溃,是很让人痛苦的.因为崩溃的位置在时间和空间上,通常是在距真正的错误源一段距离之后才表现出来.前几天线上模块因堆内存写越界1个字节引起各种诡异崩溃,定位问题过程中的折腾仍历历在目,今天读到<深入理解计算机系统>第9章-虚拟存储器,发现书中总结了C程序中常见的内存操作有

《深入理解计算机系统》第六周学习笔记

第四章 处理器体系结构 (一)知识点总结 一.Y86指令集体系结构 1.Y86处理器状态类似于IA32,有8个程序寄存器: %eax.%ecx.%edx.%ebx.%esi.%edi.%esp.%ebp.处理器的每个程序寄存器存储一个字.%esp被入栈.出栈.调用和返回指令作为栈指针. 2.3个一位的条件吗:ZF.SF.OF,它们保存最近的算术或逻辑指令所造成影响的有关信息.程序计数器PC存放当前正在执行指令的地址. 3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态 4.Y8

深入理解计算机系统(4.2)---硬件的魅力

引言 这个系列已经很久没更新了,记得上一篇博文已经是三月份了,实在是抱歉.最近业余时间没有以前充裕了,因此更新一篇博文已经变成了一种奢侈.记得以前刚开始写的时候,最多的时候LZ一天写过3篇博文,现在想想,往事如梦. 好了,好不容易写一次,就不多说废话了,本文主要介绍一下硬件以及HCL语言的内容. 从疑问开始 首先,在介绍本文的内容之前,我们先来思考一个看似简单,却实际比较“高深”的问题.众所周知,计算机归根结底是在和0.1打交道,那么到底0和1是如何被计算机记住的呢? 怎么样,这个问题是不是有点

深入理解计算机系统(3)

深入理解计算机系统(3) 本文我们主要讲关于数据的的表示方式:原码,反码和补码. 本文在写作过程中,参考了园中的这篇文章<原码,反码,补码详解>,特此声明. 一原码 计算机中是使用二进制来表示数据的,对于C语言这样的强类型语言,每一个数值类型,都有其范围,例如一个int类型,在32位机器上,其表示的范围如下: 最小值 最大值 有符号整数 -2147483648 217483647 无符号整数 0 4294967295 而如果我们定义了一个int类型,给其的赋值,超出了这个范围,则会出现问题.一

深入理解计算机系统(1.1)------Hello World 是如何运行的

上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对,但是这并不影响 LZ 对深入理解计算机系统研究的热情.这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的生命周期开始系统的学习,包括它被程序员创建,到在系统上运行,输出简单的消息,然后终止.LZ 将沿着这个程序的声明周期,先简要的介绍一些逐步出现的关键概念.专业术语以及组成部分.后面将会详细展开. 1.计算机系统 我们知道计算机系统是由硬件和软件组成的.它们共同工作来运行应用程序.虽然系统的实现方式随

深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言中的有符号数和无符号数 上一篇博客我们给出了C语言中在32位机器和64位机器中支持的整型类型数据,我们这里只给出32位机器上的: 尽管 C 语言标准没有指定有符号数要采用某种编码表示,但是几乎所有的机器都使用补码.通常大多数数字是默认有符号的,比如当声明一个像12345或者0xABC这样的常量的时候

CSAPP深入理解计算机系统第二章荟萃

1.可以利用数字的算数右移,然后利用0XFF这样的数字做掩码运算,可以获取到一个数字的符号位.计算机的移位运算有一种很重要的作用就是利用掩码运算去提取一个位模式的一段信息. 2.在C语言中的条件语句,以及三目的条件运算符,都可以用移位的方式来做. 3.在进行位扩展操作的时候,比较讲一个32位的有符号数扩展到64位,那么在保证原来的值不变的情况下,把31个低位扩展到64位的低位上,而最高的符号位扩展到高33位上. 4.利用位模式仅仅只能表示一些2的n次幂的一些浮点数,其他的比较特殊的有理数,会近似

《深入理解计算机系统(第三版)》第二章 信息的表示和处理

<深入理解计算机系统(第三版)>第二章 信息的表示和处理 ??计算机本身是由处理器和存储器子通过系统组成.在核心部分,我们需要方法来表示基本数据类型,比如整数和实数运算的近似值.然后,我们考虑机器级指令如何操作这样的数据,以及编译器又如何将C程序翻译成这样的指令.接下来,研究几种实现处理器的方法,帮助我们更好的了解硬件资源如何被用来执行指令.理解了编译器和机器级代码,我们就能了解如何通过编写C程序以及编译它们来最大化程序的性能.本章主要使我了解了如何表示和执行应用程序,通过一些技巧,来写出安全

《深入理解计算机系统(第三版)》第三章

3.1 程序编码 1.计算机系统使用了多种不同形式的抽象,对于机器级编程来说,两种抽象尤为重要: 指令集体系结构(ISA):定义了处理器状态.指令的格式,以及每条指令对状态的影响 机器级程序使用的存储器地址是虚拟地址:提供的存储器模型看上去是一个非常大的字节数组 2.反汇编器使用的指令命名规则与GCC生成的汇编代码使用的有区别.反汇编省略了指令结尾的q,给call和ret指令添加了q后缀. 3.可执行程序反汇编和对.c反汇编产生的代码有差别.对于可执行文件的反汇编,链接器将代码的地址移到了一段不