Echemos un vistazo al siguiente fragmento de código en C/C++.
C++
// An Unsigned char example #include <iostream> using namespace std; void fun1() { unsigned char i; for (i = 0; i < 256; i++) cout << i << " "; } int main() { fun1(); return 0; } // This code is contributed by shubhamsingh10
C
// An Unsigned char example #include<stdio.h> void fun1() { unsigned char i; for (i = 0; i < 256; i++) printf("%d ", i); } int main() { fun1(); return 0; }
Producción:
Infinite Loop
Explicación:
Sabemos que el tamaño de la variable de carácter es de 8 bits o 1 byte. Por lo tanto, según la representación de números decimales en base 2, el número máximo en 8 bits es 11111111. Esto se debe a que el rango de números sin signo en 8 bits varía de 0 a 2 8 -1
Ahora (11111111) 2 = (255) 10
Si llevamos el ciclo hasta 255 comenzando desde 0, ejecutará la declaración en el ciclo 256 veces (tanto 0 como 255 inclusive). A medida que el bucle llega a (255) 10 , después de ejecutarlo, la variable «i» se incrementa en 1, es decir, siguiendo la aritmética del complemento a 2,
(11111111) 2 + (00000001) 2 = (00000000) 10
Nota: el acarreo final se descarta en este caso; por lo tanto, el número incrementado final es 0, lo que da como resultado la reejecución del ciclo, por lo tanto, el ciclo se ejecuta infinitas veces. Por lo tanto, la condición anterior se puede evitar si ponemos un límite a char i sin signo para que sea menor que 255 en lugar de 256.
Ahora considere el siguiente programa:
C++
// A signed char example #include <iostream> using namespace std; void fun2() { signed char i; for (i = 0; i < 128; i++) cout << i <<" "; } int main() { fun2(); return 0; } // This code is contributed by shubhamsingh10
C
// A signed char example #include<stdio.h> void fun2() { signed char i; for (i=0; i<128; i++) printf("%d ",i); } int main() { fun2(); return 0; }
Salida en GCC (comportamiento indefinido en estándar):
Infinite Loop
El rango de caracteres firmados pertenece de -2 7 a 2 7 -1, por lo que también se aplica a la ejecución infinita si el límite es <128.
Tenga en cuenta que el complemento a 2 de (127) 10 es (01111111) 2 sumando 1 a lo que nos dará (10000000) 2, que es -(128) 10 cuando se calcula a partir de la forma de complemento a 2.
Entonces, ¿cómo pasar de 0 a máximo (255 o 128 o cualquier otro límite máximo)?
Una forma de hacer esto se encuentra a continuación.
// One way of looping till maximum of unsigned in C/C++ #include<stdio.h> void fun1() { unsigned char i = 0; do { printf("%d ", i); i++; } while (i > 0); } int main() { fun1(); return 0; }
Salida: Números del 0 al 255
// One way of looping till maximum of signed in C/C++ // (Same as above except first statement) #include<stdio.h> void fun2() { signed char i = 0; do { printf("%d ", i); i++; } while (i > 0); } int main() { fun2(); return 0; }
Salida en GCC: Números del 0 al 127
Nota: En C, el desbordamiento con signo es un comportamiento indefinido, por lo tanto, es posible que la solución anterior no funcione en todas las máquinas para números con signo. Además, la salida que se muestra arriba para la firma puede no ser la misma en todas las máquinas. El comportamiento está bien definido para números sin signo.
Los siguientes se mencionan en C99 aquí .
Acerca de Sin signo:
un cálculo que involucre operandos sin signo nunca puede desbordarse, porque un resultado que no puede ser representado por el tipo entero sin signo resultante se reduce módulo el número que es uno mayor que el valor más grande que puede ser representado por el tipo resultante
Acerca de Signed:
Un ejemplo de comportamiento indefinido es el comportamiento en el desbordamiento de enteros.
Este artículo es una contribución de Pranjal Mathur . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
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