Módulo en números negativos

¿Cuál será la salida del siguiente programa en C? 
 

C++

#include <iostream>
using namespace std;
 
int main() {
 
   int a = 3, b = -8, c = 2;
   cout << a % b / c;
   return 0;
}

C

#include <stdio.h>
int main()
{
   int a = 3, b = -8, c = 2;
   printf("%d", a % b / c);
   return 0;
}

C#

using System;
 
public class GFG{
 
    static public void Main ()
    {
      int a = 3;
      int b = -8;
      int c = 2;
       
         Console.WriteLine(a % b / c);
    }
}
 
// This code is contributed by sarajadhav12052009
Producción

1

% y / tienen la misma precedencia y asociatividad de izquierda a derecha. Entonces, % se realiza primero, lo que da como resultado 3 y / se realiza a continuación, lo que da como resultado 1. El énfasis es que se agrega un signo de un operando izquierdo al resultado en el caso del operador de módulo en C.
 

C++

#include <iostream>
using namespace std;
 
int main() {
     int a = 3, b = -8;
     cout << a % b;
    return 0;
}

C

#include <stdio.h>
int main()
{
   // a positive and b negative.
   int a = 3, b = -8;
   printf("%d", a % b);
   return 0;
}

C#

using System;
 
public class GFG{
 
    static public void Main ()
    {
        int a = 3;
        int b = -8;
         
        Console.WriteLine(a % b);
    }
}
 
// This code is contributed by sarajadhav12052009

Producción 

3

C++

#include <iostream>
using namespace std;
 
int main()
{
   // a negative and b positive
   int a = -3, b = 8;
   cout << a%b;
   return 0;
}

C

#include <stdio.h>
int main()
{
   // a negative and b positive
   int a = -3, b = 8;
   printf("%d", a % b);
   return 0;
}

C#

using System;
 
public class GFG{
 
    static public void Main ()
    {
        int a = -3;
        int b = 8;
       
           Console.WriteLine(a % b);
    }
}
 
// This code is contributed by sarajadhav12052009

Producción 

-3

Pero a partir de la definición del resto (como se indica aquí https://en.wikipedia.org/wiki/Remainder ), siempre debe ser un número entero mínimo positivo que debe restarse de a para hacerlo divisible por b (matemáticamente si, a = QB + r entonces 0 ≤ r < |b|).

Entonces, en el ejemplo anterior, -3 no es nuestro resto real porque es negativo. 

Por lo tanto, en el lenguaje C/C++ siempre encontramos el resto como (a%b + b)%b (agregar el cociente al resto y nuevamente tomar el resto) para evitar el resto negativo.

C++

#include <iostream>
using namespace std;
 
int main() {
   // a and b both negative
   int a = -3, b = -8;
   cout << a % b;
   return 0;
}

C

#include <stdio.h>
int main()
{
   // a and b both negative
   int a = -3, b = -8;
   printf("%d", a % b);
   return 0;
}

C#

using System;
 
public class GFG{
 
    static public void Main ()
    {
        int a = -3;
        int b = -8;
       
        Console.WriteLine(a % b);
    }
}
 
// This code is contributed by sarajadhav12052009

Producción 

-3

Cualquiera puede predecir la salida de un operador de módulo cuando ambos operandos son positivos. Pero cuando se trata de números negativos, diferentes idiomas dan resultados diferentes.

En lenguaje C, el módulo se calcula como,

a % n = a – ( n * trunc( a/n ) ).

Por ejemplo,
8 % -3 = 8 – ( -3 * trunc(8/-3) )
           = 8 – ( -3 * trunc(-2.666..) )
           = 8 – ( -3 * -2 ) { redondeado hacia cero}
           = 8 – 6
           = 2

Nota importante :

Numerador

Denominador

 

 

signo x

signo Y

signo X/Y

signo X%Y

+

+

+

+

+

+

+

+

De la tabla anterior, concluimos que el operador % siempre considera un signo de un numerador

Para obtener más información, consulte https://en.wikipedia.org/wiki/Modulo_operation

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *