C89中两个负数的整数除法行为:取整规则及案例疑问
C89中负数整数除法的行为解析
嘿,这个问题问到点子上了,刚好是C89标准里整数除法的一个容易混淆的细节,我给你理得明明白白:
首先直接给结论:两个负数进行整数除法时,在C89中结果是确定的,不会出现两种可能;只有一正一负的整数除法,结果才是实现定义的(编译器可选择向上或向下取整)。
接下来详细拆解:
- C89对整数除法的核心规定是:当除法结果无法整除时,截断方向是「实现定义」的——这和「未定义行为」完全不同,编译器必须明确自己的处理方式并文档化,但不同编译器可以选择不同方向(比如向零截断或者向下取整)。
- 先看一正一负的情况,比如
-8/5:数学上结果是-1.6,如果编译器采用「向零截断」,结果是-1;如果采用「向下取整(floor)」,结果是-2——这两种情况在C89里都是合法的,取决于具体编译器实现。 - 再看你问的两个负数相除的例子
-8/-5:数学结果是1.6,这时候不管编译器选哪种截断方式,结果都是1。因为正数的向下取整和向零截断结果完全一致(1.6的整数部分是1,floor(1.6)也是1)。换句话说,两个负数相除的结果等价于它们绝对值相除的结果,不存在任何歧义。
关于这点,K.N.King在《C Programming: A Modern Approach》里也明确提到过:C89没有强制整数除法必须向零截断,这导致异号数相除的结果存在差异,但同号数(不管是两个正数还是两个负数)相除时,结果的整数部分是统一的——因为同号相除的结果必然是非负数,截断方向的差异不会影响最终的整数结果。
举个代码例子更直观:
int var; var = -8 / -5; // 在C89中,var的值一定是1,没有第二种可能 var = -8 / 5; // 在C89中,var可能是-1或-2,具体看编译器实现
内容的提问来源于stack exchange,提问作者Yash Catchem




