Interesante bucle infinito usando caracteres en C

Ya hemos estudiado cómo funciona un “ bucle for ”. Mira el siguiente programa:

int main(){
    int i;
    for(i = 0; i < 128; i++){
        printf("I am %d\n", i);
    }
    return 0;
}

En el ciclo anterior, la instrucción printf() se ejecutará 128 veces. Ahora, mira el siguiente programa:

int main()
{
    char i;
    for(i = 0; i < 128; i++){
        printf("I am %d\n", i);
    }
    return 0;
}

Ahora, ¿puedes adivinar cuántas veces se ejecutará la instrucción printf() en el bucle «for» anterior? ¿Crees que este ciclo también se ejecutará 128 veces? La respuesta es no». Funcionará indefinidamente. Investiguemos este programa para saber la verdad detrás de él. Ejecutemos este programa y veamos su salida. Pero cada línea se imprime tan rápido que ni siquiera se puede ver con claridad. Disminuyamos su velocidad de ejecución agregando algunos bucles ficticios. Mira el siguiente programa:

int main(){
    char i;
    for(i = 0; i < 128; i++){
        printf("I am %d\n", i);
  
                for(int j=0; j < 1000; j++)
            for(int k=0; k < 1000; k++)
    }
    return 0;
}

Se han agregado bucles adicionales después de la declaración de impresión. Estos bucles adicionales se ejecutarán 1000 × 1000 veces y consumirán algo de tiempo. Esto reducirá la velocidad general del programa y ahora podrá ver claramente cada línea de salida como se muestra a continuación:

I am 0
I am 1
...
...
...
I am 126
I am 127
I am -128
I am -127
I am -126
...
...
...
...

¿Notaste algo en el resultado anterior? Parece del programa que 128 vendrá después de 127 y el ciclo terminará. Pero -128 ha venido después de 127 y -128 es menor que 128, lo que satisface la condición y, por lo tanto, el ciclo no se detiene. Pero la pregunta es por qué -128 viene después de 127. Exploremos la razón.

Explicación : por lo general, una variable de carácter ocupa 1 byte (8 bits) de memoria para almacenar un carácter. Entre estos 8 bits, el bit más significativo que se encuentra más a la izquierda es el bit de signo y los 7 bits restantes representan la magnitud. Si el bit de signo es 0, representa un valor +ve y, de lo contrario, un valor -ve. Por lo tanto

Value of "i"    Binary representation
0                   0000 0000 
1                   0000 0001
2                   0000 0010
...
...
...
126                 0111 1110
127                 0111 1111

Ahora súmale 1.

0111 1111
      + 1
---------
1000 0000

Por lo tanto, ahora, nuestra variable de carácter «i» contendrá «1000 0000». Ahora, el bit de signo es 1, lo que significa que es un número -ve. Probablemente sepa que los enteros negativos se representan usando el formato de complemento a 2 y la representación de complemento a 2 de -128 es “1000 0000”. Por lo tanto, el valor de «i» se convierte en -128 en lugar de +128. Por lo tanto 0, 1, 2, …, 127, -128, -127, …, -1, 0, 1, 2… continuará.
Pero no ocurre lo mismo en el primer programa donde “i” era una variable entera. Porque el tamaño de una variable entera es de 2 bytes o 4 bytes dependiendo de su sistema operativo. Si el tamaño de la variable entera es de 2 bytes (16 bits), ¿puede decir el valor mínimo de «n» que hará que el siguiente ciclo sea un ciclo infinito?

int main(){
    int i;
    for(i = 0; i < n; i++){
        printf("I am %d\n", i);
    }
    return 0;
}

El número entero +ve máximo que se puede representar usando 16 bits es «0111 1111 1111 1111» o 65535. Cuando «i» se vuelve igual a este valor máximo, el siguiente incremento lo convierte en -65536 en lugar de +65536. Por lo tanto el valor mínimo de “n” será 65536.

Publicación traducida automáticamente

Artículo escrito por Subham_Ghosh 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 *