对于c ++整数,1除以2是否可靠地等于0,而3/2 = 1,5 / 2 = 2等?

时间:2013-01-11 16:59:27

标签: c++ integer-division

有两个不同但相关大小的向量。 (2 * RESOLUTION) + INDEX_OFFSET(例如2050)越大,RESOLUTION越小(例如1024)。我认为可以安全地假设uint16_t可用于包含向量索引。

通过将resultIndex递增2来执行对较大向量的迭代。在每次迭代期间,对索引(resultIndex - INDEX_OFFSET) / 2处的较小向量进行赋值。

本质上,代码依赖于以下假设:无论INDEX_OFFSET是奇数还是偶数,上述除以2将始终向下舍入,无论架构如何。例如,如果resultIndex为0或1,则预期为0,如果是2或3则预期为1,依此类推。在上述参数范围内,这是一个安全的假设吗?

N.B。我承认存在'Dividing integer types - Are results predictable?'但它似乎并不完全匹配。

1 个答案:

答案 0 :(得分:15)

是;这是由语言保证的:

  

[C++11: 5.6/4]:二进制/运算符产生商,二进制%运算符从第一个表达式除以第二个表达式得到余数。如果/%的第二个操作数为零,则行为未定义。 对于积分操作数,/运算符产生代数商,丢弃任何小数部分; 如果商a/b在结果类型中可表示,(a/b)*b + a%b为等于a

3/2中,32都是整数操作数;此操作的代数商为1.5,当您丢弃小数部分.5时,您得到1。这适用于您的其他示例以及所有其他示例。