es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿El operador módulo (%) en C devuelve un resultado indefinido en comparación con la misma función en Python?

Estoy escribiendo un programa (que pensé) era sencillo para implementar el cifrado afín y he encontrado un problema en el que no estoy obteniendo los resultados esperados del módulo en C89.

int main()
{
foo(10);
return 0;
}

int foo(int enc)
{
int a = 5, b = 22, inv_a = 77, result;
result = (inv_a * (enc – b)) % 128;
printf(“result = %d = %c\n”, result, result);
return result;
}

El resultado de lo anterior es -28 (¿comportamiento indefinido?)

Mientras tanto, la misma función en Python:

def foo(enc):
a = 5
b = 22
inv_a = 77
result = (inv_a * (enc – b)) % 128
print(result)

foo(10)

devuelve mi resultado esperado de 100. Durante el proceso de depuración encontré que los resultados son iguales hasta que se utiliza el módulo en C. ¿Qué está sucediendo en el módulo de C del que no estoy consciente?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el operador módulo en C89. Es posible que el operador módulo no esté comportándose como se esperaba debido al hecho de que los operandos son enteros con signo. En C89, el operador módulo se define como el resto de la división del primer operando por el segundo operando. Cuando los operandos son enteros con signo, el resultado de la operación módulo puede ser negativo.

    Para obtener el resultado esperado, puedes utilizar un tipo de dato entero sin signo para los operandos. Esto asegurará que el resultado de la operación módulo sea siempre positivo. Alternativamente, puedes utilizar la función abs() para asegurarte de que el resultado sea siempre positivo.

Comments are closed.