带符号整数的除法与余数

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

带符号整数的除法与余数

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 都是整数,

  • 12
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值