有符号数与无符号数的转换,取模运算与取余运算的区别

您所在的位置:网站首页 php求余数符号 有符号数与无符号数的转换,取模运算与取余运算的区别

有符号数与无符号数的转换,取模运算与取余运算的区别

#有符号数与无符号数的转换,取模运算与取余运算的区别| 来源: 网络整理| 查看: 265

编程中,我们可能会遇到有符号数与无符号数的转换,难免对其产生困惑,他们的转换关系是怎么样的?而这个转换过程又涉及到取模运算,而且模运算在数论和程序设计中都有着广泛的应用,奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题(中国剩余定理)到凯撒密码问题,无不充斥着模运算的身影。所以有必要对其进行研究,结果又发现取模运算与取余运算非常类似,它们的区别是什么呢?

下面对这些困惑一一解析。

“模”的概念

“模”是指一个计量系统的计数范围。“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10。表示n位的计算机计量范围是0~2^n-1, 模=2^n。

值得注意的是,“模”和“循环”相关。有些情况下的“循环”问题,例如字母和数字循环,用模来解决可能会比较简单。

补码

计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同.在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。

正整数的补码是其二进制表示,与原码相同。负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1数0的补码表示是唯一的。[+0]补=[+0]反=[+0]原=00000000[ -0]补=11111111+1=00000000有符号数与无符号数的转换关系

计算机中存储二进制数11111111时,1.如果数据类型是有符号数,表示-1。计算机中负数是以补码形式存储的,-1的补码11111111;2.如果数据类型是无符号数,表示255。255的二进制编码为11111111。程序中的赋值,就是把二进制编码直接复制过去,然后根据数据类型解析成我们看到的数字。255也是-1对256(2^8=256)求模后的值。

如果在编程时混用有符号数和无符号数,在C++合法,在有符号数为负时,会被自动转换为无符号数,导致异常。把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模(无符号数的模=2^无符号数的位数)。数学公式的角度看就是2^8+(-1)=255。其中8是二进制数的位数,-1是当数据类型为有符号数时表示的数值,255是当数据类型为无符号数时表示的数值。

取模运算取模运算(“Modulo Operation”)和取余运算(“Remainder Operation ”)两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。取模主要是用于计算机术语中。取余则更多是数学概念。取模运算与取余运算的区别

对于整型数a,b来说,取模运算或者求余运算的方法都是:

1.求整数商: c = [a/b]。取余运算在取c的值时,向0方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。2.计算模或者余数: r = a - c*b。求模运算和求余运算相同。fix()是一个取整函数,取整规则是向最靠近零取整。fix(2.5)=2fix(-2.5)=-2floor()是一个取整函数,取整规则是向负无穷方向舍入。floor(+2.7) = +2.0floor(-2.7) = -3.0floor(-0.0) = -0.0floor(-Inf) = -inf

例1.计算:-7 Mod 4

a = -7;b = 4第一步:求整数商c:①进行求模运算c = [a/b] = -7 / 4 = -2(向负无穷方向舍入),②进行求余运算c = [a/b] = -7 / 4 = -1(向0方向舍入);第二步:计算模和余数的公式相同,但因c的值不同,①求模时:r = a - c*b =-7 - (-2)4 = 1,②求余时:r = a - cb = -7 - (-1)*4 =-3。

MATLAB程序验证:

a=-7; m=4; b = mod (a,m) %%取模 b = rem (a,m) %%取余

例2.计算:7 Mod 4

a = 7;b = 4第一步:求整数商c:①进行求模运算c = [a/b] = 7 / 4 = 1②进行求余运算c = [a/b] = 7 / 4 = 1第二步:计算模和余数的公式相同①求模时:r = a - c*b =7 - (1)4 = 3,②求余时:r = a - cb = 7 - (1)*4 =3。

总结:当a和b的正负号一样的时候,两个运算的结果是等同的;当a和b的符号不同时,取余运算结果的符号和a一样,而取模运算结果的符号和b一样。

注:

不同语言%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

取模运算的应用

1.判别奇偶数已知一个整数n对2取模,如果余数为0,则表示n为偶数,否则n为奇数。2.判别素数质数(或素数)只有1和它本身两个因数。试除法——用不比该自然数的平方根大的正整数去除这个自然数,若该自然数能被整除,则说明其非素数。3.求最大公约数求最大公约数最常见的方法是欧几里德算法(又称辗转相除法),其计算原理依赖于定理:gcd(a,b) = gcd(b,a mod b)具体实现见风尘拂柳:分而治之——土地方形分割(最大公约数)——欧几里得算法(辗转相除法)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3