You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动