补码的数学原理

计算机是用n位0和1来表示数字的,这样很容易表示正数,但是怎么表示负数呢?

人类聪明的大脑想到了用第一位来表示符号,0代表正数,1代表负数。这种表示方法最好理解,叫做原码。

但是计算机在计算的时候,为了简化,需要把减法当做加法运算。这个很简单,负数不就是干这个的吗?比如2-1=2+(-1)。

但是负数如果按照原码表示的话,就不好办了,比如:

2-1=2+(-1)=00000010+10000001=10000011=-3

显然是错的,所以人类习惯的方法无法满足这个需求,根本原因在于符号位的引入不符合计算机运行原理。

那么,肿么办呢?

首先介绍模的概念:数学上7位数可以表示[0, 127]共128个值,超过128就会溢出,那么128就是7位数的模。

模一定的情况下,减法都可以变换成加法来运算,比如:

你要把钟表往前拨2个小时,你可以把它往前拨10个小时来实现。这里-2就转化为了+10。

下面看同余数的数学定义:

如果a和b对于一个数m的余数相同,成a和b为m的同余数,或者称a和b互为补数,记做:

a ≡ b (mod m)

那么问题来了,负数的余数如何定义?

数学上是

就是:x对y的余数等于x减去y乘上x与y的商的下界。

而显然,一个数的余数一定是它的同余数。

这样如果你想算a-b的话(a,b都是正数),可以算成a+(-b的补数),比如:

模为128的情况下,2-1=2+(-1)=2+(128-1)=128+1,由于溢出,结果是1

终于算对了!撒花庆祝!但是还有下一个问题:

给定负数的原码,如何让计算机方便的算出负数的补数?

假如用n位来表示数,那么-a=2^(n-1)-a-2^(n-1),其中a为正数

而a表示成10进制的话,

是a=k0*2^0+k1*2^1+k2*2^2+...k(n-2)*2^(n-2),为什么是n-2呢?因为原码要留一位给符号位,所以只有n-1位有效位。

而2^(n-1)=1+1*2^0+1*2^1+1*2^2+...+1*2^(n-2),所以

2^(n-1)-a=1+(1-k0)*2^0+(1-k1)*2^1+(1-k2)*2^2+...(1-k(n-2))*2^(n-2),也就是除了最高位之外,其他部分取反加1。

而剩下的-2^(n-1),它的补数是2^(n-1),也就是还要再加上个最高位为1其他全为0的数.

那么就得出我们教科书的结论:

对于负数,原码到补码就是:符号位为1,其他位取反加1(不可进位到符号位)。

显然,对于正数,补码等于原码(想想钟表的例子)。

注意一个特例,-128是没有原码的,因为原码的表示范围就是[-127~127],0有10000000和00000000两个。

但是按补码算的话,-127-1=11111111+10000001=10000000

所以补码是可以表示-128的,因此补码的表示范围是[-128~127]

注意,补码的计算完全是2进制的计算,没有符号位,而且该溢出溢出。

总结:

1. 计算机都是用补码表示数,语言在编译的时候已经把原码转换成了补码,再写入内存。

比如

int i=-1;

printf("%x\n",i);

输出就是0xFFFFFFFF

2. 计算机不知道减法,也不知道符号位,它只知道加法和溢出。所以补码运算只有加法和溢出。

3. print的时候,%d是打印原码,%x是打印计算机里的原始数据。而用0x80000000来赋值的话,其实是直接赋值给计算机内存原始数据。

比如

int i=0x80000000;

printf("%d\n",i);

输出就是-2147483648

时间: 2024-07-30 16:46:06

补码的数学原理的相关文章

图像处理中的数学原理详解17——卷积定理及其证明

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.4.5   卷积定理及其证明 卷积定理是傅立叶变换满足的一个重要性质.卷积定理指出,函数卷积的傅立叶变

word2vec 中的数学原理详解

word2vec 中的数学原理详解 word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Mikolov 在两篇相关的论文 [3,4] 中并没有谈及太多算法细节,因而在一定程度上增加了这个工具包的神秘感.一些按捺不住的人于是选择了通过解剖源代码的方式来一窥究竟. 第一次接触 word2vec 是 2013 年的 10 月份,当时读了复旦大学郑骁庆老师发表的论文

PCA的数学原理

PCA(Principal Component Analysis)主成成分分析法,是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维.网上关于PCA的文章有很多,但是大多数只描述了PCA的分析过程,而没有讲述其中的原理.这篇文章的目的是介绍PCA的基本数学原理,帮助读者了解PCA的工作机制是什么. 当然我并不打算把文章写成纯数学文章,而是希望用直观和易懂的方式叙述PCA的数学原理,所以整个文章不会引入严格的数学

图像处理中的数学原理详解18——内积与外积

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.3.2 内积与外积 因为cos(π/2)=0.当然,这也是众多教科书上介绍向量内积最开始时常常用到的一

【机器学习笔记之七】PCA 的数学原理和可视化效果

PCA 的数学原理和可视化效果 本文结构: 什么是 PCA 数学原理 可视化效果 1. 什么是 PCA PCA (principal component analysis, 主成分分析) 是机器学习中对数据进行降维的一种方法. 例如,我们有这样的交易数据,它有这几个特征:(日期, 浏览量, 访客数, 下单数, 成交数, 成交金额),从经验可知,“浏览量”和“访客数”,“下单数”和“成交数”之间会具有较强的相关关系.这种情况下,我们保留其中的两个维度就可以保证原有的信息完整. 但是当我们在做降维的

反向传播(Backpropagation)算法的数学原理

准备 本文不是一篇引导读者入门的科普文.读者至少需要对人工神经网络有概念性的理解,并且熟悉偏导数. 这是一个简单的人工神经网络,分为输入层,隐藏层和输出层.输入层以原始数据 x 作为本层向下一层的输出,即 a(1):隐藏层将 a(1) 中的元素进行线性组合作为自己的输入,即 z(2),然后将 z(2) 进行一个数学变换(函数 g(z))作为对下一层的输出,即 a(2).以此类推,得到最后一层的输出,即 a(3) 或 hΘ(x),就是人工神经网络的运算结果. 其中 Θ(1), Θ(2) 分别是第1

图像处理中的数学原理具体解释21——PCA实例与图像编码

欢迎关注我的博客专栏"图像处理中的数学原理具体解释" 全文文件夹请见 图像处理中的数学原理具体解释(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 假设你对PCA的推导和概念还不是非常清楚.建议阅读本文的前导文章 http://blog.csdn.net/baimafujinji/article/details/50372906 6.4.3 主成分变换的实现 本小节通过一个算例验证一下之前的推导.在前面给出的

图像处理中的数学原理详解21——PCA实例与图像编码

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 如果你对PCA的推导和概念还不是很清楚,建议阅读本文的前导文章 http://blog.csdn.net/

相同概率的抽奖程序另类实现——使用数据库,无需数学原理

抽奖,是很多企业.聚会的常见玩乐形式,光彩绚丽的抽奖屏幕背后,是计算程序+抽奖用户信息.程序=算法+数据结构. 好,说抽奖程序的的实现吧.这个实现一般需要应用数学原理.而本文的方法是我在参加一次婚礼的抽奖体验后突然想到的,一种比较简单.无需数学原理的方法. 功能:能按照相同概率,从用户集合中抽出随机的部分用户集合作为中奖者.抽奖可以进行多次,对已中奖的用户不会重复抽取. 使用技术: 1.SqlServer数据库,使用NewID()作为select随机筛选函数 2.sql随机函数 3.为了快速方便