standard - c versions
¿ANSI C o ISO C especifican qué-5% 10 debería ser? (2)
Para agregar un pequeño detalle a la respuesta de KennyTM: Si los Estándares C llaman a algo que la implementación define, entonces esa implementación es necesaria para documentar la elección que hace. Por lo general, esto se encuentra en la documentación del compilador o de la biblioteca (página del manual, manual de ayuda, documentos impresos, folleto del CD :-) Cualquier implementación que afirme ser conforme a C89 o posterior debe proporcionar esto en algún lugar. Intente buscar tal documento. En el caso de gcc
por ejemplo, esto está en la información de gcc:
4 C Comportamiento definido por la implementación
Se requiere una implementación conforme de ISO C para documentar su elección de comportamiento en cada una de las áreas que se designan como "implementación definida". A continuación se enumeran todas estas áreas, junto con los números de sección de las normas ISO / IEC 9899: 1990 e ISO / IEC 9899: 1999. Algunas áreas solo están definidas por la implementación en una versión del estándar.
Algunas opciones dependen de la ABI determinada externamente para la plataforma (incluidas las codificaciones de caracteres estándar) que GCC sigue; Estos se enumeran como "determinado por ABI" a continuación. * Tenga en cuenta la compatibilidad binaria: compatibilidad y `http://gcc.gnu.org/readings.html ''. Algunas opciones están documentadas en el manual del preprocesador. * Nota Comportamiento definido por la implementación: (cpp) Comportamiento definido por la implementación. Algunas opciones las realiza la biblioteca y el sistema operativo (u otro entorno al compilar para un entorno independiente); Consulte su documentación para más detalles.
Menú:
Implementación de traducción ::
- Implementación del entorno:
- Implementacion de identificadores ::
- Implementacion de personajes ::
- Implementacion de enteros ::
- Implementación de punto flotante ::
- Implementación de arrays y punteros ::
- Implementación de sugerencias:
- Estructuras unidas enumeración e implementación de campos de bits:
- Implementación de calificadores ::
- Implementación de declaradores ::
- Implementación de sentencias ::
- Implementación de directivas de preprocesamiento:
- Implementación de funciones de biblioteca ::
- Implementación de arquitectura ::
- Implementación del comportamiento específico de la localidad:
Me parece recordar que ANSI C no especificó qué valor debe devolverse cuando cualquiera de los operandos de un operador de módulo es negativo (solo que debe ser consistente). ¿Se especificó más tarde, o siempre se especificó y estoy recordando incorrectamente?
C89, no totalmente (§3.3.5 / 6). Puede ser -5 o 5, porque -5 / 10 puede devolver 0 o -1 ( %
se define en términos de una ecuación lineal que incluye /
, *
y +
):
Cuando los enteros se dividen y la división es inexacta, si ambos operandos son positivos, el resultado del operador
/
es el mayor entero menor que el cociente algebraico y el resultado del operador%
es positivo. Si cualquiera de los operandos es negativo , si el resultado del operador/
es el mayor entero menor que el cociente algebraico o el mayor entero mayor que el cociente algebraico está definido por la implementación , como es el signo del resultado del operador%
. Si el cocientea/b
es representable, la expresión(a/b)*b + a%b
será iguala
.
C99, sí (§6.5.5 / 6), el resultado debe ser -5:
Cuando los enteros se dividen, el resultado del operador
/
es el cociente algebraico con cualquier parte fraccionaria descartada. 88) Si el cocientea/b
es representable, la expresión(a/b)*b + a%b
será iguala
.88) Esto a menudo se llama "truncamiento hacia cero".
De manera similar, en C ++ 98, el resultado se define por la implementación (§5.6 / 4), siguiendo la definición de C89, pero menciona que se prefiere la regla de redondeo hacia cero,
... Si ambos operandos son no negativos, el resto es no negativo; si no, el signo del resto está definido por la implementación 74) .
74) De acuerdo con 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.
y de hecho se convierte en la regla estándar en C ++ 0x (§5.6 / 4):
... Para los operandos integrales, el operador
/
produce el cociente algebraico con cualquier parte fraccionaria descartada; 82 ...82) Esto a menudo se llama truncamiento hacia cero.