2011-12-23 19 views
6

Estaba notando algunos cambios de redacción en la sección 5.6 para C++ 11. (Estoy viendo el borrador del estándar C++ N3242, con fecha del 02/02/2011). El nuevo estándar (borrador) incluye la oración:División de enteros en C++ 11

"Para operandos integrales, el operador/produce el cociente algebraico con cualquier parte fraccional descartada ; "

Esta declaración no está en 5.6 del estándar 03 (ISO-IEC-14882-2003), pero no creo que esto sea un cambio, ¿o sí? Así es como C y C++ han funcionado durante años a menos que haya perdido la cabeza (lo que puede haber sucedido de todos modos).

Respuesta

9

No te estás volviendo loco.

Una nota al pie de 5.6/4 dijo:

[C++03 footnote 74]: según la obra 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 el que el cociente siempre se redondea hacia cero.

En C++ 11 este comportamiento se requiere explícitamente en lugar de ser "preferido"; el cambio aparece en la sección de compatibilidad:

[C++11: C.2.2]:
Cambio: Especificar redondeo de resultados de número entero / y %
Justificación: Aumentar la portabilidad, compatibilidad C99.
Efecto sobre la función original: Válido C++ código 2003 que utiliza la división entera redondea el resultado hacia 0 o hacia el infinito negativo, mientras que este Norma Internacional siempre redondea el resultado hacia 0.

1

Casi. En C++ 03, el signo del resto para % (en el que se especificaron ambos términos) no se especificó, ya que el redondeo también podría pasar de cero en ciertas situaciones. Comparar con la nota al pie C++ 03:

según la obra en curso hacia la revisión de ISO C, la algoritmo preferido para la división entera según las normas definidas en la norma ISO Fortran , ISO/IEC 1539: 1991 , en el que el cociente siempre es redondeado hacia cero.

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

+0

Esto hará una gran diferencia en mi código. ¿Significa esto que el signo del resultado de '%' también se define ahora? – ThomasMcLeod

+1

@ThomasMcLeod: Sí, todo el asunto '/'/'%' ahora está definido para comportarse igual en todas partes. ¿Estás seguro de que hace una diferencia en tu código? ¿Es su implementación una de las pocas que aún no se trunca? – PlasmaHH

+1

Hay al menos dos formas de interpretar un operador de módulo. La forma más común es simplemente el resto de la división. En este caso, el signo del resultado es el mismo que el signo del cociente. Por ejemplo, '-5% -4 == 1 && -5% 4 == -1'. Otra forma es la forma algebraica, donde el operador de mod devuelve la clase de congruencia del operando.En este caso, 'a% m == b' si y solo si' m' divide '(b - a)' y se define donde 'm' es positivo. Aquí. 'b' es un valor no negativo estrictamente menor que' m', y por lo tanto '-5% 4 == 3'. – ThomasMcLeod