2010-08-30 10 views
135

Per esempio,Qual è il comportamento della divisione dei numeri interi?

int result; 

result = 125/100; 

o

result = 43/100; 

comporterà sempre il piano di divisione? Qual è il comportamento definito?

+0

Riepilogo: *** la divisione intera * con segno * viene troncata verso lo zero **. Per risultati non negativi, è uguale a floor (round verso -Infinity). (Attenzione che C89 non garantisce questo, vedere le risposte.) –

risposta

135

Il risultato sarà sempre il piano della divisione? Qual è il bahavior definito?

Sì, il quoziente intero dei due operandi.

6.5.5 Operatori moltiplicativi

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

e la corrispondente nota:

88) Questo è spesso chiamato ‘‘troncamento verso zero’’.

Naturalmente due punti da notare sono:

I normali conversioni aritmetiche vengono eseguite su operandi.

e:

Il risultato della/operatore è la quoziente della divisione del primo operando dal secondo; il risultato dell'operatore% è il resto . In entrambe le operazioni, se il valore del secondo operando è zero, il comportamento non è definito.

[Nota: la mia enfasi]

+11

... a meno che, ovviamente, non si stia dividendo un numero negativo con un positivo (o v.v.), nel qual caso sarà il limite massimo. –

+53

Non è né pavimento né soffitto, è troncatura della parte frazionaria, è concettualmente diverso! – Wizard79

+25

@Will A: No. Viene definito come troncamento verso zero. Chiamarlo diversamente aggiungerà solo confusione, quindi per favore evita di farlo. –

11

Sì, il risultato è sempre troncato verso zero. Arrotonderà verso il minimo valore assoluto.

-5/2 = -2 
5/2 = 2 

Per valori firmati non firmati e non negativi, questo è uguale al piano (arrotondamento verso -Infinity).

+38

Troncamento, * non * piano. – dan04

+7

@ dan04: yep floor sarebbe valido solo per numeri interi positivi :) – Leonid

15

Se il risultato è negativo, C tronca verso 0 piuttosto che pavimenti - ho imparato questa lettura circa il motivo per cui la divisione intera Python sempre piani qui: Why Python's Integer Division Floors

+2

Sono d'accordo con il commento chiedendo se avere (neg% pos) andare negativo è sempre utile? Su una nota correlata, mi chiedo se il comportamento aritmetico richiesto in alcuni casi di "unsignedvar> signedvar" sia sempre utile? Riesco a capire la logica per non richiedere un comportamento sempre corretto; Non vedo ragioni per aver richiesto un comportamento sbagliato. – supercat

+6

+1 per un eccellente riferimento sul perché il pavimento è il comportamento corretto per la divisione intera (contrariamente alla definizione di C, che è rotta e quasi mai utile). –

+0

corretto e preciso. +1. –

33

Dirkgently dà an excellent description della divisione intera in C99, ma dovresti anche sapere che in C89 la divisione intera con un operando negativo ha una direzione definita dall'implementazione.

Dalla bozza ANSI C (3.3.5):

Se uno degli operandi è negativo, se il risultato della/operatore è il più grande intero minore del quoziente algebrico o il più piccolo intero maggiore della il quoziente algebrico è definito dall'implementazione, così come il segno del risultato dell'operatore%. Se il quoziente a/b è rappresentabile, l'espressione (a/b) * b + a% b deve essere uguale a a.

Quindi fai attenzione ai numeri negativi quando sei bloccato con un compilatore C89.

È un fatto divertente che C99 abbia scelto il troncamento verso zero perché è stato così che FORTRAN ha fatto. Vedi this message su comp.std.c.

+0

E la bozza C99 N1256 prefazione paragrafo 5 menziona 'divisione intera affidabile 'come una nuova funzione di lingua. Incredibile '* - *'. –

+0

Il troncamento è il modo in cui si comporta l'hardware della CPU più comune (ad esempio x86), quindi sarebbe pazzesco fare una scelta diversa. IDK che è venuto prima, semantica di Fortran o comportamento hardware, ma non è una coincidenza che anche quelli siano uguali. –

10

Sarà sempre il piano della divisione?

No. Il risultato varia, ma la variazione si verifica solo per valori negativi.

Qual è il comportamento definito?

per chiarire giri piano verso l'infinito negativo, mentre divisione intera arrotonda verso lo zero (tronca)

Per valori positivi sono la stessa

int integerDivisionResultPositive= 125/100;//= 1 
double flooringResultPositive= floor(125.0/100.0);//=1.0 

Per valore negativo questo è diverso

int integerDivisionResultNegative= -125/100;//=-1 
double flooringResultNegative= floor(-125.0/100.0);//=-2.0 
Problemi correlati