Il mio amico ha detto che ci sono differenze tra "mod" e "restinder".
In tal caso, quali sono queste differenze in C e C ++? '%' Significa "mod" o "rem" in C?
Il mio amico ha detto che ci sono differenze tra "mod" e "restinder".
In tal caso, quali sono queste differenze in C e C ++? '%' Significa "mod" o "rem" in C?
Risposte:
C'è una differenza tra modulo e resto. Per esempio:
-21mod 4è 3perché lo -21 + 4 x 6è 3.
Ma -21diviso per 4dà -5con un resto di -1.
Per valori positivi, non c'è differenza.
%era sempre il resto, ma poteva anche essere il modulo (cioè sempre positivo), perché in C89 la divisione di numeri interi era autorizzata a arrotondare verso l'infinito negativo anziché verso 0. Quindi in C89, -5 / 2potrebbe essere -2con il resto -1, o -3con il resto 1, l'implementazione doveva solo documentare quale. C99 ha rimosso la flessibilità, quindi ora lo -5 / 2è sempre -2.
-21mod ? Perché il calcolo è ? 43-21 + 4 x 6
-21 + 4 x 6è compreso tra 0 e 3.
'%' Significa "mod" o "rem" in C?
In C, %è il resto 1 .
..., il risultato
/dell'operatore è il quoziente algebrico con qualsiasi parte frazionaria scartata ... (Questo è spesso chiamato "troncamento verso zero".) C11dr §6.5.5 6Gli operandi
%dell'operatore devono essere di tipo intero. C11dr §6.5.5 2Il risultato
/dell'operatore è il quoziente della divisione del primo operando per il secondo; il risultato%dell'operatore è il resto ... C11dr §6.5.5 5
Qual è la differenza tra "mod" e "remainder"?
C non definisce "mod", come la funzione del modulo intero utilizzata nella divisione euclidea o altro modulo . La "mod euclidea" differisce dall'operazione di C a%bquando aè negativa.
// a % b
7 % 3 --> 1
7 % -3 --> 1
-7 % 3 --> -1
-7 % -3 --> -1
Modulo come divisione euclidea
7 modulo 3 --> 1
7 modulo -3 --> 1
-7 modulo 3 --> 2
-7 modulo -3 --> 2
Codice modulo candidato:
int modulo_Euclidean(int a, int b) {
int m = a % b;
if (m < 0) {
// m += (b < 0) ? -b : b; // avoid this form: it is UB when b == INT_MIN
m = (b < 0) ? m - b : m + b;
}
return m;
}
Nota sul virgola mobile: double fmod(double x, double y) anche se chiamato "fmod", non è lo stesso della divisione euclidea "mod", ma simile al resto intero in C:
Le
fmodfunzioni calcolano il resto in virgola mobile dix/y. C11dr §7.12.10.1 2
fmod( 7, 3) --> 1.0
fmod( 7, -3) --> 1.0
fmod(-7, 3) --> -1.0
fmod(-7, -3) --> -1.0
Disambiguazione : C ha anche una funzione denominata similedouble modf(double value, double *iptr) che suddivide il valore dell'argomento in parti integrali e frazionarie, ognuna delle quali ha lo stesso tipo e segno dell'argomento. Questo ha poco a che fare con la discussione "mod" qui, tranne la somiglianza dei nomi.
1 Prima di C99, la definizione di C %era ancora il resto della divisione, tuttavia /consentiva di arrotondare i quozienti negativi anziché "troncamento verso zero". Vedi Perché ottieni valori diversi per la divisione di numeri interi in C89? . Pertanto, con alcune compilation precedenti al C99, il %codice può agire proprio come la divisione "mod" euclidea. Quanto sopra modulo_Euclidean()funzionerà anche con questo resto della vecchia scuola alternativo.
Il modulo, nell'aritmetica modulare come ci si riferisce, è il valore rimasto o il valore rimanente dopo la divisione aritmetica. Questo è comunemente noto come resto. % è formalmente l'operatore residuo in C / C ++. Esempio:
7 % 3 = 1 // dividend % divisor = remainder
Ciò che resta da discutere è come trattare gli input negativi per questa operazione%. I moderni C e C ++ producono un valore residuo con segno per questa operazione in cui il segno del risultato corrisponde sempre all'input del dividendo indipendentemente dal segno dell'input del divisore.
In C e C ++ e in molti linguaggi, %il resto NON è l'operatore del modulo.
Ad esempio, nell'operazione -21 / 4la parte intera è -5e la parte decimale è -.25. Il resto è la parte frazionaria del divisore, quindi il nostro resto è -1. JavaScript utilizza l'operatore residuo e lo conferma
console.log(-21 % 4 == -1);
L'operatore del modulo è come se avessi un "orologio". Immagina un cerchio con i valori 0, 1, 2 e 3 rispettivamente alle posizioni 12, 3, 6 e 9. Aumentare i tempi del quoziente in senso orario ci atterra sul risultato della nostra operazione del modulo o, nel nostro esempio con un quoziente negativo, in senso antiorario, ottenendo 3.
Nota: il modulo è sempre lo stesso segno del divisore e il resto lo stesso segno del quoziente. Aggiungendo il divisore e il resto quando il resto almeno uno è negativo si ottiene il modulo.
In matematica il risultato dell'operazione modulo è il resto della divisione euclidea. Tuttavia, sono possibili altre convenzioni. Computer e calcolatrici hanno vari modi di memorizzare e rappresentare numeri; pertanto la loro definizione dell'operazione modulo dipende dal linguaggio di programmazione e / o dall'hardware sottostante.
7 modulo 3 --> 1
7 modulo -3 --> -2
-7 modulo 3 --> 2
-7 modulo -3 --> -1
0 ≤ r < |b|che significa il resto aka "operazione modulo". è sempre almeno 0. Quale definizione stai usando che risulta in -2 e -1?
a%be a modulo bhanno lo stesso significato quandoa,b sono positivi. C99 definisce %con precisione valori negativi. C chiama questo "resto". "Modulo" ha varie definizioni nel mondo relative a valori negativi, mentre C specifica usa "modulo" solo nel contesto di numeri positivi.