带符号整数的除法与余数
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 都是整数,