Nel caso in cui qualcuno dovesse preoccuparsi:% ritorna davvero il resto, non il modulo. Finché i numeri sono positivi, non c'è differenza.
Per i numeri negativi, tuttavia, può esserci una differenza. Per esempio, -3/2 può dare due possibili risposte: -1 con un resto di -1, o -2 con un resto di 1. Almeno come è normalmente usato nell'aritmetica modulare, il modulo è sempre positivo, quindi il primo il risultato non corrisponde a un modulo.
C89/90 e C++ 98/03 consentono entrambe le risposte, purché/e% producano risposte che lavorino insieme in modo da poter riprodurre l'input (cioè -1x2 + -1 -> - 3, -2x2 + 1 = -3).
versioni più recenti delle norme (C99, C11 e C++ 11) non c'è più alcuna scelta: divisione intera deve rotondo verso 0. Ad esempio -3/2 deve dare -1 con resto di - 1. -3/2 dare -2 con un resto di 1 non è più consentito.
fonte
2009-10-01 15:29:17
il resto può essere negativo Lo standard C++ richiede solo l'uguaglianza (a/b) * b + (a% b) = a nel caso b! = 0 e consente alla divisione intera di arrotondare verso zero (C++ 0x lo richiede anche) – sellibitze
Anche se il resto può solo essere negativo se il dividendo è negativo (o il divisore, ma qui è 2). Quindi, a seconda del "codice", questo potrebbe non essere un problema, e si spera che il programmatore abbia pensato a questo quando si documenta come utilizzare la macro SHUFFLE_STATEMENT_2. –