c 整数运算

一、无符号加法(形式的模运算,无符号加法等价于计算模2w 的和)

  示例:非负数 x 和 y

  位数: w(8位机)

  范围: 0 <= x,y <= 2-1

  结果:0 <= x+y <= (2-1 + 2-1)  ====>  0 <= x+y <= 2w +1-2

  比如:200 + 100 = 300 (2-1 <= 300 <=  2w +1-2 )  ====> 300 mod 2w(256) = 44

  过程:300转换成二进制:100101100,但是咱们是8位机,我们从右往左数,左边的是高位,右边的是低位,把去高位舍去,保留8位:00101100(转换成10进制就是44)

  那么这里就会出现一个很重要的概念:溢出?拿上边的示例来说明:当x + y > 2-1的时候,这个x+y的结果就会溢出,如图(整数加法和无符号加法之间的关系):

  

  从这个图中我们可以分析一下,大概有两种情况(假设:w为4位 ):

  a. x + y < 2w 它的结果的w+1位表示中的最高位会等于0,就算丢弃了最高位也不会改变值得大小,可能大家会很疑惑这事什么意思?

    比如: 6+5 = 12 < 24(16),那么12的4位二进制表示 1100,w+1位的表示为01100,这就是上边说的w+1位表示中的最高位会等于0,就算把这个最高位去掉,结果变成4位1100,还是12,值不变

  b. 2w < x + y < 2w+1 它的结果的w+1位表示中最高位会等于1,因此如果咱们把最高位丢弃了,它就相当于减去了2w ?????

    比如:5+16 = 21,那么2w(16) < 21 < 2w+1(32),21的二进制是 10101,最高位是1,那么去掉最高位的话结果就是0101(5),结果 x + y - 2w,从上图可以看出 0 < x + y - 2w < 2w+1 - 2w = 2w ,结果就在0~2中,刚好x和y的和,然后再模2的结果

  ,该图就是对上边两种情况最好的表示

  那么咱们说一个算术溢出,是指完整的正数结果不能放到该数据类型的字长限制中去,就像上边的例子一样,w位4位,最大值为16,计算出一个21,那么这就是算术溢出,21不能放到4位长度类型里边去,

  如何判断是否发生了溢出呢??

    比如: s = x + y;w=4, 0 <= x,y <= 2w

    (1).当x + y >= x的时候,s就没有溢出,可以肯定s >= x;比如 1+13 = 14 < 2w 没有产生溢出,结果是14,那么 1+13 >= x

    (2).当s确实溢出了,那么公式就是s = x + y - 2w ,比如 1+15 = 16 >= 2w ,产生了溢出,结果当然是0了,那么 s < x,就产生了溢出

  加法逆元(必须满足 -x + x = 0):

    a. x = 0,那么它的加法逆元就是0

    b. x > 0,那么它的加法逆元就是 2w - x,这是为什么呢? 根据逆元运算 -x + x = 0  =====> x + 2w - x = 2w == 2w 溢出了,结果就是0

    

二、二进制补码加法

  

      

时间: 2024-10-09 15:29:05

c 整数运算的相关文章

算术运算符——整数运算

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

《深入Java虚拟机学习笔记》- 第12章 整数运算

Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢出在这里通常可以被忽略. 整数加法 操作码 操作数 说明 iadd (无) 从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈 ladd (无) 从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 将一个常量与局部变量相加 操作码 操作数 说明 iinc vindex

大整数运算

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

shell学习笔记之四(整数运算)

算数运算符 shell只支持整数运算 常见的算数运算大多结合shell的内建命令let来使用. + - * / % **(幂运算) += -= *= /= %= 位运算 >> << & | ^ ~ 自增自减 ++ -- 例: let "b=3" let "a=(++b)" 其他算数运算 简单的算数运算过程中,如果有一个值是字符的,那么解析为0 如R+2=2 1.使用$[]作运算 1.到目前看到的$这样的形式有:${}(数组) $[](

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

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

Web Service(0):用Web Service实现两个整数运算

最近,项目开发中需要用到Web Service.自己在网上搜集资料.自己做了一个小例子,用来加深自己对Web Service理解. 概念:Web Service主要是为了使原来各孤立的站点之间的信息能够相互通信.共享而提出的一种接口. Web Service所使用的是Internet上统一.开放的标准,如HTTP.XML.SOAP(简单对象访问协议).WSDL等,所以Web Service可以在任何支持这些标准的环境(Windows,Linux)中使用.注:SOAP协议(Simple Objec

第12章 整数运算

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

大整数运算模板总结

大整数运算模板总结. 大整数结构体表示 整型数组从低位到高位顺序存储每一位数字,另外需要存储数字的长度. struct bign { int d[1000]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; } }; 大整数输入 一般通过字符串输入. bign Change(string str)//输入字符串转大整数 { bign a; a.len = str.length(); for (int i = 0; i < a.len; i++

Mysql整数运算NULL值处理注意点

CleverCode最近在导出报表的时候,在整数做减法的时候,发现整数减去null得到是null.这是一个细节问题,希望大家以后注意. 1 表中的数据 total,used都是整形,允许为空. 2 有问题的运算语句 减法问题 select id, total, used, (total - used) as have from test_table 3 正确的写法 使用ifnull,来处理null. select id, ifnull(total,0) as total, ifnull(used