División entera en C ++ 11

Noté algunos cambios de redacción en la sección 5.6 para C ++ 11. (Estoy viendo el borrador de la norma C ++ N3242, con fecha 2011-02-28.) La nueva norma (borrador) incluye la oración:

“Para los operandos integrales, el operador / produce el cociente algebraico con cualquier parte fraccionaria descartada”;

Esta statement no se encuentra en 5.6 de la norma 03 (ISO-IEC-14882-2003), pero no creo que esto sea un cambio, ¿verdad? Así es como C y C ++ han funcionado durante años a menos que haya perdido la cabeza (lo que puede haber ocurrido de todos modos).

No te estás volviendo loco.

Una nota a pie de página de 5.6/4 decía:

[C++03 footnote 74]: Según el trabajo en curso hacia la revisión de ISO C, el algoritmo preferido para la división de enteros sigue las reglas definidas en la norma ISO Fortran, ISO / IEC 1539: 1991, en la cual el cociente siempre se redondea hacia cero.

En C ++ 11, este comportamiento se requiere explícitamente en lugar de ser “preferido”; El cambio está listado en la sección de compatibilidad:

[C++11: C.2.2]:
Cambio: Especifique el redondeo para los resultados de entero / y %
Fundamento: Aumentar la portabilidad, compatibilidad C99.
Efecto en la característica original: el código válido de C ++ 2003 que usa la división entera redondea el resultado hacia 0 o hacia el infinito negativo, mientras que esta Norma Internacional siempre redondea el resultado hacia 0.

Casi. En C ++ 03, el signo del rest para % (en el que se especificaron ambos términos) no se especificó, ya que dicho redondeo podría desaparecer de cero en ciertas situaciones también. Compare con el pie de página de C ++ 03:

Según el trabajo en curso hacia la revisión de ISO C, el algoritmo preferido para la división de enteros sigue las reglas definidas en la norma ISO Fortran, ISO / IEC 1539: 1991, en la que el cociente siempre se redondea hacia cero.

En la práctica, sin embargo, esto casi nunca hizo ninguna diferencia.