整数运算(加减乘除的底层操作)

对于计算机来说,加减乘除法全部用二进制来实现,那么他们是如何实现的呢?

先说加法,加法有两种,其实区别不大只是解释方式不同,原码加法(无符号)和补码加法(有符号,加完依然是补码)。方法都一样,有一落一,无一落零,两一进位。但这样必须考虑溢出的问题,对于32位机,所有数都用32位来表示,加法可能会向前进一位,也就是最多有33位,怎么办? 33位数无法表示,其实很简单,对于原码加法,只要溢出了,那么最高位一定是一,表示的结果会把最高位的一强行截掉,这样实际上我们看到的值就是(正确值-2^32)得到的。那么补码加法就比较麻烦了,多了个符号位,所以可以分情况讨论:1、正负得负,2、正负得正,3、正正得正,4、负负得负。前两种溢出无影响(很容易就可以得出结论); 第三种溢出之后显示的结果必然是正确值相对于无符号最大数的补数;第四种情况自己总结吧 =。=

减法涉及不到溢出,使用加法来实现的,写起来比较麻烦,自己想想吧。

乘法,先说说溢出吧,乘法的溢出是很恐怖的,一般情况下,由于位宽不变,超出位宽的数要全部被截掉,然后给你显示出来,这个显示出来的数和正确值是有关系的,显示的数=正确值%正数最大值(比如32位 2147483648)。再说说乘法效率的问题,如果给他们排个序,一定是这样的  加法《减法《乘法《除法 。  可以毫不夸张地说,乘法的运算效率比加法低十几倍!  那怎么办呢? 总不能不用乘法吧, 为此很多编译器都做了优化,因为乘一个数,总能转换成左移和加减法的组合运算,从而降低复杂度,比如x*14,可以转化成 (x<<3)+(x<<2)+(x<<1)  也可以写成 (x<<4)-(x<<1)。为什么呢? 看看14的二进制码就知道了,1110!  没错第一种形式和快速幂的原理差不离。第二形式可以作为一个延伸。

除法,除法就更慢了,而且还有除不开取整的情况,负数向后取整(-3.14 取整 -4),正数向零取整(3.14 取整 3),哦对,编译器已经规避了这种非习惯性的取整方式(方法是对负数除法是加上一个偏移量), 除法并没有什么优化方法,没有乘法的那种规律,所以他很慢,真的很慢,能不用就不用吧。

时间: 2024-08-07 04:09:18

整数运算(加减乘除的底层操作)的相关文章

关于大整数的加减乘除求余运算 java

自己用java 实现了大字符串整数的加减乘除和求余运算, 加减法的算法是模拟手工笔算的计算过程, 除法就是从最高位不停的减操作, 乘法的算法 :遍历一个数的各个位数以及他所在位置,另一个数根据这个数的位置末位添n个0,然后累加次数为这个位置数的数值 原创代码如下: public class Demo6 { public static void main(String[]args){ System.out.println(add("-989","989")); Sys

大整数的加减乘除

多项式的加减乘除能够利用多项式的加减乘除进行运算,所以下面程序採用了多项式的加减乘除.多项式运算已经在<算法导论>第30章有简要的介绍,详细的请參考数学书. 大整数加法:(利用书上公式轻松得出) //多项式加法-大数加法 #include <iostream> #include <time.h> using namespace std; #define m1 4 #define m2 5 //a[0]=x^0 a[1]=x^1....a[n]=x^n的关于x的多项式系数

大整数运算

对于A,B的范围在int范围内,求解A与B的加减乘除运算我相信大家很快就可以写出程序来,但是如果A,B是有着1000个数位的整数呢?恐怕就没有已有的数据类型来表示了,这时候只能老实的模拟加减乘除运算的过程.模拟加减乘除的运算的过程,原理就是小学的. 大整数又称为高精度整数,其含义就是用基本的数据类型无法存储其精度的整数.大整数运算即高精度运算. 首先,介绍大整数的存储. 很简单,用数组即可.例如,int型数组d[1000]:如将123456存储到数组中,则有d[0]=6,d[1]=5......

linux平台学x86汇编(十):整数运算

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 这一节介绍如何在编语言中上使用整数运算,包括加法.减法.乘法和除法. 加法指令 add指令用于把两个整数想加.格式如下: add src, dest 其中src可以是立即数值.内存地址.寄存器.dest可以是寄存器或内存中的值,不能同时使用内存地址作为源和目标.结果存放在dest中.和其他GNU汇编指令一样,需要在add结尾添加b.w.l来指定操作数长度.如果没有使用整个寄存

大整数运算C++1

//下面的代码勉强算是bignum_beta1版本! //实现了大整数的加减乘除四则运算,以及求两个整数的最大公约数,以及求乘法逆,miller_rabin素性检验,平方_乘法算法 //不足之处,位数还很难扩展至几千位,以及运算速度有一点慢,既然是beta1,说明bug还是挺多的 //程序缺少测试数据来测试,所以有的结果不敢保证其正确性 //由于使用c++复写了很多运算符,加入这个文件之后,大数bignum可以看做是一个如同如同int一样的基本类型 //可以像int一样加减乘除和输入输出 #in

大整数运算C++

//下面的代码勉强算是bignum_beta1版本! //实现了大整数的加减乘除四则运算,以及求两个整数的最大公约数,以及求乘法逆,miller_rabin素性检验,平方_乘法算法 //不足之处,位数还很难扩展至几千位,以及运算速度有一点慢,既然是beta1,说明bug还是挺多的 //程序缺少测试数据来测试,所以有的结果不敢保证其正确性 //由于使用c++复写了很多运算符,加入这个文件之后,大数bignum可以看做是一个如同如同int一样的基本类型 //可以像int一样加减乘除和输入输出 #in

第12章 整数运算

12.1 二进制补码运算Java虚拟机所支持的所有的整数类型-byte, short.int和long,它们都是带符号的二进制补码数.二进制补码方案既能够描述正整数,也能够描述负整数.在一个二进制补码数中,最重要的位就是它的符号位.符号位为1,表示负整数:符号位为0,表示正整数和数字0. 能够被二进制补码方案表示的数的范围为:2的总位数次幂.例如,在Java中,short类型是16位带符号的二进制补码整数.能够惟一表示的整数数为:216或者65536.short类型值范围的一半被用来表示0和正整

算术运算符——整数运算

shell中进行整数运算需要借助一些辅助工具,如:expr.declare.let.((  )).$[  ] 1.expr有很多不完善之处,此处不写. 2.declare: declare -i 命令定义整形变量,当使用此命令对变量赋值后,变量便可进行算术运算. 需要注意的是: 如果给整形变量赋值的是一个字符串值,则bash会将变量赋值为0. 使用declare -i命令生成的变量执行算术运算时,各变量之间不能有空格. [email protected]:~$ declare -i m n [e

css3 calc():css简单的数学运算-加减乘除

css3 calc():css简单的数学运算–加减乘除 多好的东西啊,不用js,一个css就解决了. .box{ border:1px solid #ddd; width:calc(100% - 100px); background:#9AC8EB; } 3栏等宽布局 .box{ margin-left:20px; width:calc(100%/3 - 20px); } .box:nth-child(3n){ margin-left:0; } 运算规则 calc()使用通用的数学运算规则,但是