带符号整数的除法与余数

本文探讨了带符号整数在不同编程语言如C、C++、Java、Python、Ruby等中的除法和取模运算行为,特别是在负数参与运算时的实现定义。C99和C++0x规定了商向0取整,而其他语言如Python和Ruby则遵循不同的取整规则。硬件实现方面,大多数处理器支持向0取整,与C99/C++0x保持一致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

带符号整数的除法与余数

Division of Signed Integers

陈硕 giantchen_AT_gmail_DOT_com

 

最近研究整数到字符串的转换,读到了 Matthew Wilson 的《Efficient Integer to String Conversions》系列文章。(http://synesis.com.au/publications.html 搜 conversions)。他的巧妙之处在于,用一个对称的 digits 数组搞定了负数转换的边界条件(二进制补码的正负整数表示范围不对称)。代码大致如下,经过改写:

 

 

 

这段简短的代码对 32-bit int 的全部取值都是正确的(从 -2147483648 到 2147483647)。可以视为 itoa() 的参考实现,面试的标准答案。

读到这份代码,我心中顿时升起一个疑虑:《C Traps and Pitfalls》第7.7节讲到,C 语言中的整数除法(/)和取模(%)运算在操作数为负的时候,结果是 implementation-defined。(网上能下载到的一份简略版也有相同的内容,http://www.literateprogramming.com/ctraps.pdf 第7.5节。)


也就是说,如果 m、d 都是整数,

### MATLAB 中除法运算获取整数商和余数的方法 在 MATLAB 中,可以使用多种方式来处理除法运算的结果以获得所需的整数商和余数。 #### 获取整数商 对于两个数值 `a` 和 `b` 进行除法运算时,可以通过不同的函数得到不同类型的整数商: - 使用 `fix()` 函数可以直接截断小数部分而返回最接近零方向上的最近整数。例如,在表达式 `aa = fix(37 / 10)` 中,结果将是 `3`[^3]。 - 如果希望按照向下的原则取整,则可采用 `floor()` 函数;它总是朝负无穷大方向舍入到下一个较低的整数。比如计算 `floor(-5.6)` 将给出 `-6` 而不是 `-5`。 - 若要依据四舍五入规则取得最邻近的整数值,应该调用 `round()` 函数。这会考虑实际的小数位来进行合理的向上或向下调整。像这样:`round(4 / 6)` 可能会产生 `1` 或者保持原样取决于具体的输入值。 值得注意的是,当涉及到正整数之间的简单除法时,MATLAB 的行为类似于 C 语言中的整数除法规则——即先执行浮点除法后再通过某种形式去除掉任何非整数成分[^1]。 #### 计算余数 为了求得两数相除后的剩余量(也就是常说的模),MATLAB 提供了两种主要的方式: - **mod()**: 此函数用于计算模数,其特点是遵循数学上标准意义上的同余关系定义,并且能够很好地处理带有符号的操作数情况。具体来说就是如果存在一个整数 k 使得 \( a - km \geqslant 0\) 成立的话那么就有\( b = mod(a,m)\)[^2]。 - **rem()**: 它同样用来找出给定一对操作数间的残差项,不过它的逻辑更贴近于计算机科学领域内的传统做法,特别是在面对负数的情况下表现有所不同。语法结构为 `r = rem(a,b)` ,其中 `a` 是被除数而 `b` 则代表除数。 综上所述,在 MATLAB 中要完成一次完整的带余除法过程,通常的做法是组合运用上述提到的各种工具,根据实际情况选取合适的手段来满足特定需求。 ```matlab % 示例代码展示如何利用这些功能 a = 19; b = 5; integerQuotientFix = fix(a / b); remainderMod = mod(a, b); remainderRem = rem(a, b); disp(['Integer Quotient (using fix): ', num2str(integerQuotientFix)]); disp(['Remainder using mod(): ', num2str(remainderMod)]); disp(['Remainder using rem(): ', num2str(remainderRem)]); ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值