Domanda

Mi sembra di ricordare che ANSI C non specificare quale valore deve essere restituito quando uno dei due operandi di un operatore modulo è negativo (solo che dovrebbe essere coerente).Ha specificato più avanti, o è sempre stato specificato e mi ricordo in modo non corretto?

È stato utile?

Soluzione

C89, non totalmente (§3.3.5/6).Può essere 5 o 5, perché -5 / 10 è in grado di restituire 0 o -1 (% è definito in termini di una equazione lineare che coinvolge /, * e +):

Quando i numeri interi sono divisi e la divisione è esatta, se entrambi gli operandi sono positivo il risultato del / l'operatore è il più grande intero minore algebrica quoziente e il risultato della % l'operatore è positivo. Se uno degli operandi è negativo, se il risultato del / l'operatore è il più grande intero minore algebrica quoziente o il più piccolo intero maggiore algebrica quoziente è definito dall'implementazione, come è il segno del risultato del % operatore.Se il quoziente a/b è rappresentabile, l'espressione (a/b)*b + a%b deve essere uguale a a.

C99, sì (§6.5.5/6), il risultato deve essere -5:

Quando i numeri interi sono divisi, il risultato del / operatore algebrico quoziente con l'eventuale parte frazionaria scartato.88) Se il quoziente a/b è rappresentabile, l'espressione (a/b)*b + a%b deve essere uguale a a.

88) Questo è spesso chiamato "il troncamento verso lo zero".


Allo stesso modo, in C++98 il risultato è l'attuazione definiti (§5.6/4), a seguito di C89 definizione, ma ricorda che il round-verso-regola zero è preferito,

...Se entrambi gli operandi sono non negativi, quindi il resto è non negativo;se non il segno del resto è definito dall'implementazione74).

74) Secondo i lavori in corso verso la revisione della norma ISO C, il preferito di algoritmo per la divisione di interi segue le regole definite nella norma ISO Fortran standard ISO/IEC 1539, anno:1991, in cui il quoziente è sempre arrotondato verso lo zero.

e, infatti, diventa la regola standard C++0x (§5.6/4):

...Integrale operandi il / operatore produce algebrica quoziente con l'eventuale parte frazionaria scartato;82 ...

82) Questo è spesso chiamato il troncamento verso lo zero.

Altri suggerimenti

Per aggiungere un po ' di dettaglio per KennyTM risposta:Se il C Standard qualcosa attuazione definiti poi l'attuazione richiesto per documentare la scelta si fa.Di solito questo sarebbe il compilatore o biblioteca di documentazione (pagina man, manuale di aiuto, stampati, documenti, libretto del CD :-) Qualsiasi implementazione sostenendo la conformità alle C89 o poi deve fornire questo da qualche parte.Prova a cercare un tale documento.In caso di gcc per esempio, questo è il gcc-info:

4 C comportamento definito dall'Implementazione


Una realizzazione conforme ISO C è tenuto a documentare la sua scelta di comportamento in ciascuna delle aree designate "attuazione definiti".Il seguente è un elenco di tali aree, lungo con i numeri di sezione da ISO/IEC 9899:1990 e ISO/IEC 9899:1999 norme.Alcune aree sono solo l'attuazione definite in uno versione dello standard.

Alcune scelte dipendono dalla esternamente determinato ABI per la piattaforma (tra cui standard di codifica dei caratteri) che GCC segue;questi sono elencato come "determinata dall'ABI" di seguito.*Nota La Compatibilità Binaria:Compatibilità, e `http://gcc.gnu.org/readings.html'.Alcune scelte sono documentati nel preprocessore manuale.*Nota Comportamento definito dall'implementazione:(cpp)comportamento definito dall'Implementazione.Alcune scelte sono fatte con la biblioteca e il sistema operativo (o altri ambiente durante la compilazione per un freestanding ambiente);fare riferimento a la loro documentazione per i dettagli.

  • Menu:

  • Traduzione di attuazione::

  • Ambiente attuazione::
  • Identificatori di attuazione::
  • Caratteri di attuazione::
  • Interi attuazione::
  • Punto mobile di attuazione::
  • Array e puntatori di attuazione::
  • Suggerimenti attuazione::
  • Strutture sindacati enumerazioni e bit-campi di applicazione::
  • Qualificatori di attuazione::
  • Declarators attuazione::
  • Dichiarazioni di attuazione::
  • Pre-elaborazione di direttive di attuazione::
  • Le funzioni di libreria di attuazione::
  • Architettura di attuazione::
  • Locale un comportamento specifico di attuazione::
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top