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

mos*_*osi 6 c++ integer-division

有两个不同但相关大小的向量.较大的是(2 * RESOLUTION) + INDEX_OFFSET(例如2050)而较小的是RESOLUTION(例如1024).我认为它足够安全,可以假设它uint16_t可以用来包含向量索引.

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

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

NB我承认存在'划分整数类型 - 结果是否可预测?' 但它似乎并不完全匹配.

Lig*_*ica 15

是; 这是由语言保证:

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

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

  • +1,感谢上帝,这是标准的。我无法想象那里没有足够的代码。 (2认同)
  • 注意:在linux =>`signal 5:算术异常`通常是由*0执行**执行*...的结果,因为编译器可能会假设分频器不是0来优化代码`,可能会发生奇怪的事情(又名"未定义的行为"). (2认同)