整数表示 补码与无符号 加法与乘法 CSAPP学习笔记

计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数。

无符号数编码:

补码编码:

由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295 。

在整数运算之前必须先了解 整数的扩展和截断

扩展分为零扩展和符号扩展,零扩展是简单的在表示的开头添加0,适用于无符号数的扩展。而符号扩展在表示中添加最高有效位值的副本,适用于补码的扩展。比如4位的1101扩展成8位,即11111101,很容易证明无符号位的扩展不改变其值。

截断简单的来讲就是丢弃较高的位,这里我们把截断跟下面提到的‘取模’(mod)当做一回事。举个补码数字的截断,11101111截断到4位数值,得到的结果是1111即-1(这里还需要将位表示转换为无符号数),这里截断到4位于mod(16)等价(如果个人理解有误,还请看官指出)。

PS:这里的mod与c/c++中的%有区别,c/c++中的除法是往0靠近,举个例子,-7%4=-3。

整数加法  两个数的w位补码之和与无符号之和有完全相同的位级表示!

无符号加法,由于两个数加起来可能会增加表示位的个数,这会使得字长膨胀,在一般的编程语言内,只支持固定精度的运算。当两个无符号数相加溢出时(两个w位加起来可能得到w+1位的值),规定丢弃最高位,等价于计算和模上2^w。

补码加法,补码加法稍微复杂点,补码加法计算方法就是先将两个数转化为无符号数,相加(使用无符号加法的规则)之后再转化回来。

其实我们平时在计算的时候只要用上面公式即可,不需要每次做计算都把整个过程走一遍,比如说先转化在相加取模在转化,啊,太烦了。

整数乘法 补码和无符号乘法运算的位级表示一样,终于知道为什么使用补码了吧,机器用同一种乘法指令来对乘法进行计算,对于加法也是一样

无符号乘法,固定的位的个数,所以直接对乘法结果取模,当实际计算两个32位长度的整数时,计算结果存放在两个寄存器中,最终的结果即其中一个寄存器的值(低32位)。

补码乘法,先得到两个数的乘积(就是补码表示的数的乘积,比如-1*7=-7),然后截断,再转化为有符号数。计算的式子如下

现在来分析为什么乘法运算的位级表示一样,即为什么无符号和补码乘积的低位是相同的。因为对于相同的两个位模式,其表示的无符号值的乘积与补码乘积取模之后的结果是一样的,用x撇,y撇表示无符号值,x,y表示补码值,则有

带2^w的都被丢弃掉了,所以低位时相同的。这个等式的意思就是无符号乘积值的位级表示进行一系列操作可以得到补码沉积值的位级表示,但是这一系列操作只与高位有关(大于等于w+1),而最后结果只与低位有关。

时间: 2024-11-05 18:12:43

整数表示 补码与无符号 加法与乘法 CSAPP学习笔记的相关文章

位向量 补码与无符号 加法与乘法 CSAPP学习笔记

计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数. 无符号数编码: 补码编码: 由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295(这里指的是32位数) . 在整数运算之前必须先了解 整数的扩展和截断 扩展分为零扩展和符号扩展,零扩展是简单的在表示的开头添加0,适用于无符号数的扩展.而符号扩展在表示中添加最高有效位值的副本,适用于补码的扩展.比如4位的1

Servlet乘法表学习笔记

一.控制台实现乘法表 package com.shanrengo; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServle

基于Java的大整数运算的实现(加法,减法,乘法)学习笔记

大整数,顾名思义就是特别大的整数. 一台64位的机器最大能表示的数字是2的64次方减一: 18446744073709551615 java语言中所能表示的整数(int)最小为-2147483648 public class test { public static void main(String[] args) { System.out.println(Integer.MIN_VALUE); } } 最大为 2147483647 public class test { public stat

多项式乘法(FFT)学习笔记

------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法     一般应用最广泛的表示方式     用A(x)表示一个x-1次多项式,a[i]为$ x^i$的系数,则A(x)=$ \sum_0^{n-1}$ a[i] * $ x^i$ 仅利用这种方式求多项式乘法复杂度为O($ n^2$),不够优秀2.点值表示法     将n个互不相同的值$ x_0$...$

嵌套循环 99乘法表 学习笔记

class TestJiuJiu  { public static void main(String[] args)  { for(int i =1; i<=9; i++){ for(int j = 1; j<=i; j++ ){ System.out.print(i+"*"+j+"="+ i*j +"\t" ); } System.out.println(); } } }

【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创] 第一题 #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts(">6"):puts("<=6"); return 0; } 答案是:>6 第二题 #include<stdio.h> int m

一个基础而奇怪的问题:算法执行加法、乘法、除法性能无区别?

一个基础而奇怪的问题:算法执行加法.乘法.除法性能无区别? 计算机原理分析觉得:加法.乘法和除法的计算性能依次减少,但减少到什么程度? 编写C程序用30次百万数据计算来測试时间差异性,代码例如以下: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void add(float x[], long n) { float sum = 0; for(long i = 0; i

汇编总结:无符号除法,有符号除法,取余,无符号乘法,有符号乘法

本文分为3个模块. 示例---该指令的示例 解释---为指令不好理解的地方 练习---为了更熟悉该指令 1.1 有符号除法指令及取余example: 在c语言里要完成 8 / 2的汇编指令如下: 在c语言里要完成 8 % 2的汇编指令如下: 4个字节的除法及取余运算示例如下: .section .text .global _start _start:     movl $8, %eax   #被除数是%edx:%eax 是这两个寄存器拼起来的%eax存放低位%edx存储高位     movl %

【VHDL】深度讲解无符号和有符号加法处理溢出的问题

1.Unsigned adders 这个比较简单,只需在A.B前面扩展一位0防止溢出,溢出的数填到第n位cout,n-1到0位就是sum. , 2.Signed adders 一开始也搞不懂下图中为什么要扩展符号位,两个符号位了怎么加?   往下看↓ 2.1 Analysis 在真正开始使用Verilog做signed加法运算前,我们先来看看实际上二进制singed加法是如何运算? Normal Condition (没有Overflow) (+6) + (-3) = (+3) 为了节省reso