Qual a diferença entre “mod” e “resto”?

Meu amigo disse que existem diferenças entre “mod” e “resto”.

Em caso afirmativo, quais são essas diferenças em C e C ++? O ‘%’ significa “mod” ou “rem” em C?

Existe uma diferença entre o módulo e o restante. Por exemplo:

-21 mod 4 é 3 porque -21 + 4 x 6 é 3 .

Mas -21 dividido por 4-5 com um resto de -1 .

Para valores positivos, não há diferença.

O ‘%’ significa “mod” ou “rem” em C?

Em C, % é o restante.

…, o resultado do operador / é o quociente algébrico com qualquer parte fracionária descartada … (Isso é freqüentemente chamado de “truncamento em direção a zero”.) C11dr §6.5.5 6

Os operandos do operador % devem ter um tipo inteiro. C11dr §6.5.5 2

O resultado do operador / é o quociente da divisão do primeiro operando pelo segundo; o resultado do operador % é o resto … C11dr §6.5.5 5


Qual a diferença entre “mod” e “resto”?

C não define “mod”, como a function do módulo inteiro usada na divisão euclidiana ou outro módulo . “Euclidean mod” difere da operação C’s a%b quando a é negativa.

  // a % b 7 % 3 --> 1 7 % -3 --> 1 -7 % 3 --> -1 -7 % -3 --> -1 

Módulo como divisão euclidiana

  7 modulo 3 --> 1 7 modulo -3 --> 1 -7 modulo 3 --> 2 -7 modulo -3 --> 2 

Código de módulo do candidato:

 int modulo_Euclidian(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 sobre ponto flutuante: double fmod(double x, double y) , embora chamado "fmod", não é o mesmo que "mod" da divisão euclideana, mas similar ao resto do inteiro C:

As funções fmod calculam o resto de ponto flutuante de x/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 

Nota: C também tem uma function nomeada similar double modf(double value, double *iptr) que divide o valor do argumento em partes integradas e fracionárias, cada uma com o mesmo tipo e sinal que o argumento.

Módulo, na aritmética modular como você está se referindo, é o valor que resta ou o valor remanescente após a divisão aritmética. Isso é comumente conhecido como resto. % é formalmente o operador restante em C / C ++. Exemplo:

 7 % 3 = 1 // dividend % divisor = remainder 

O que resta para discussão é como tratar as inputs negativas para esta% de operação. C e C ++ modernos produzem um valor de resto assinado para essa operação em que o sinal do resultado sempre corresponde à input de dividendo sem considerar o sinal da input do divisor.

Na matemática, o resultado da operação de módulo é o restante da divisão euclidiana. No entanto, outras convenções são possíveis. Computadores e calculadoras têm várias maneiras de armazenar e representar números; assim, sua definição da operação do módulo depende da linguagem de programação e / ou do hardware subjacente.

  7 modulo 3 --> 1 7 modulo -3 --> -2 -7 modulo 3 --> 2 -7 modulo -3 --> -1