La tarea es encontrar el mayor valor int con un bucle. Tengo exactamente el mismo código casi en C y en Java. En Java funciona bien, pero en CI obtiene el valor más pequeño y me gustaría saber por qué.
C
#include <stdio.h> int main() { int i = 0; for (; i+1 > 0; i++) { } printf("%d", i); return 0; }
Java
public class Java { public static void main(String[] args) { int i = 0; for (; i+1 > 0; i++) { } System.out.println(i); } }
Su código parece asumir falsamente que en C, se garantiza que un int
se ajustará a un número negativo en el desbordamiento . Esta suposición es incorrecta. Tal desbordamiento de enteros con signo invocará un comportamiento indefinido en C, por lo que no puede confiar en ningún comportamiento específico si deja que eso suceda.
Para encontrar el mayor valor representable de un int
, puede usar la macro constante INT_MAX
, que se define en limits.h
.
Sin embargo, tenga en cuenta que solo el desbordamiento de enteros con signo invoca un comportamiento indefinido en C. En contraste con eso, cuando se usan números sin signo, se garantiza que se ajustarán de una manera bien definida. Por lo tanto, podría encontrar el unsigned int
representable más grande utilizando su método.
Además, algunos compiladores tienen una configuración que hará que el comportamiento del desbordamiento de enteros con signo quede bien definido (suponiendo que su hardware lo admita y use el complemento a dos para representar números con signo, que es probablemente el caso). En gcc y clang, puede usar la opción de línea de comandos del compilador -fwrapv
para lograr esto.