位向量 补码与无符号 加法与乘法 CSAPP学习笔记
计算机中用位来表示整数,一种方式只能表示非负数,一种可以表示有符号数。
无符号数编码:
补码编码:
由上面的定义可以知道补码与无符号之间的对应关系(见下式),最高位为0时,补码与无符号表示是一样的,而最高位为1时,举个例子,补码表示的-1对应于无符号数的4294967295(这里指的是32位数) 。
在整数运算之前必须先了解 整数的扩展和截断
扩展分为零扩展和符号扩展,零扩展是简单的在表示的开头添加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),而最后结果只与低位有关。
转载于:https://www.cnblogs.com/Nastukashii/p/4399618.html
位向量 补码与无符号 加法与乘法 CSAPP学习笔记相关推荐
- 编程实现 无符号加法溢出判断
//无符号加法溢出判断 #include<iostream> using namespace std; int uadd_ok(unsigned x,unsigned y) {unsign ...
- 二进制补码计算——有符号数的乘法
位数问题 a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width. 定点小数问题 小数位数等于a的小数位数,加上b的小数位数之和. 补码相乘问题 补码 * 补码 ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- 用无符号加法和移位实现除法
#include<stdio.h> typedef unsigned int us; /*:10/3=3--1令商为s=0的和,余数为被除数a的差的和,i在32~2位时,10>> ...
- 有监督学习和无监督学习举例_监督学习入门学习笔记
以下内容引用:An Introduction to Machine Learning with Python by Andreas C. Müller and Sarah Guido (O'Reill ...
- oracle10g无监听配置文件,Oracle 10g学习笔记(七) tnsnames.ora 监听配置文件详解
监听配置文件 为了使得外部进程 如 CAMS后台程序 能够访问 Oracle 数据库 必须配 置 Oracle 网络服务器环境 配置 Oracle 网络服务器环境是通过配置 listener.ora ...
- 【无标题】加固替换Application学习笔记
替换地方 protected void attachBaseContext(Context base) base 也可以通过getBaseContext()获取 base.mOuterContext ...
- 假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移
假设我们在对有符号值使用补码运算的32位机器人运行代码.对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移.变量的声明和初始化如下: int x = foo(); //任意值 int y = ...
- 有符号数无符号数比较(学习笔记)
最近在CSAPP看到一个有趣的小例子 -1== 4294967295? 先上代码 #include<iostream> #include<bitset> #include< ...
最新文章
- 重磅直播|光学3D测量技术原理及应用
- 从ThinkPHP框架核心讨论C、E、G、L、T、I、N...等函数
- Mysql数据库事务详解
- IDEA将Maven项目中src源代码下的xml配置文件编译进classes
- NXP KW38开发杂记(一)MCUXpress 运行进入NMI_Handler
- 2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型
- UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 723269-723270: illegal multibyte s
- 求连续区间和为目标值的一种解题思路
- python 传奇服务端_传奇游戏服务器源码学习
- 收不到 macOS 正式版更新提醒,如何在Mac上彻底退出Beta计划
- C++ WinExec system 隐藏黑框;清空文件
- python下载pip包_python之路-离线pip下载Python包
- 多重重要性采样(MIS)与光线追踪技术
- .md文件简单的转化为pdf文件
- 一杯咖啡带你读懂状态机
- 自动机器学习-H2O.ai
- WINDOWS 7 X86专业版SP1后续补丁包20150901(微软官方下载地址列表)
- linux编辑lnk文件,如何打开和编辑Windows .lnk快捷方式文件? | MOS86
- 七夕送什么蓝牙耳机?时尚好用的蓝牙耳机推荐
- 9.10教师节 Best wishes to teachers
热门文章
- 《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的
- Java面试题 实现单例设计模式(懒汉、饿汉)
- .Net 下载网络图片
- Oracle 11g 新特性简介
- JAVA 中的数据结构
- 面试一位硕士海龟前端小姐姐有感
- MySQL Execution Plan--执行计划中的Type列
- 【转】Asp.NetMve移除HTTP Header中服務器信息Server、X-AspNet-Version、X-AspNetMvc-Version、X-Powered-By:ASP.NET...
- Java开发WebService(使用Java-WS)
- Spring AOP EXPRESSION