Foros del Web » Programación para mayores de 30 ;) » Programación General »

¿Porqué da un overflow?

Estas en el tema de ¿Porqué da un overflow? en el foro de Programación General en Foros del Web. Hice un bucle para que me muestre todos los caracteres ASCII y sus valores, desde el 33 (!) hasta el 255 (ÿ). Si lo compilo ...
  #1 (permalink)  
Antiguo 11/04/2006, 16:44
Avatar de X.Cyclop
Usuario baneado!
 
Fecha de Ingreso: diciembre-2005
Ubicación: México, D.F.
Mensajes: 1.328
Antigüedad: 18 años, 4 meses
Puntos: 0
¿Porqué da un overflow?

Hice un bucle para que me muestre todos los caracteres ASCII y sus valores, desde el 33 (!) hasta el 255 (ÿ).
Si lo compilo y lo ejecuto, me da algo así como un overflow. Solo sirve si le pongo hasta el 100. ¿Porqué pasa esto? ¿Hay alguna solución?

Este es el código:

Código PHP:
#include <stdio.h>

main() {
       
char m;

       for(
33<= 100m++)
       
printf("%c \t %i\n"mm); 
       
getch();
       } 
Uso el Dev-C++.
  #2 (permalink)  
Antiguo 11/04/2006, 20:15
Avatar de X.Cyclop
Usuario baneado!
 
Fecha de Ingreso: diciembre-2005
Ubicación: México, D.F.
Mensajes: 1.328
Antigüedad: 18 años, 4 meses
Puntos: 0
*inche Gorka, no explica todo, pero bue...

Cambié el tipo a short y ya sirvió.
  #3 (permalink)  
Antiguo 11/04/2006, 22:57
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
el problema que tenia tu codigo es que el tipo de dato char, puede almacenar valores desde el -128 hasta el 127. Por lo que no puede ir mas alla del 127, y cuando le queres asignar el 128, se te arma el quilombo, otra solucion que podrias haber usado es la del modificador unsigned. que permite que el char maneje valores de 0 a 256.

Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #4 (permalink)  
Antiguo 12/04/2006, 01:47
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por TolaWare
otra solucion que podrias haber usado es la del modificador unsigned. que permite que el char maneje valores de 0 a 256.
Eso es lo mas adecuado aunque en realidad un BYTE (unsigned char para C) puede almacenar valores entre 0 y 255.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 12/04/2006, 07:13
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por TolaWare
el problema que tenia tu codigo es que el tipo de dato char, puede almacenar valores desde el -128 hasta el 127. Por lo que no puede ir mas alla del 127, y cuando le queres asignar el 128, se te arma el quilombo, otra solucion que podrias haber usado es la del modificador unsigned. que permite que el char maneje valores de 0 a 256.

Saludos
En realidad,

char, 1 byte, de -127 a 127
unsigned char, 1 byte, de 0 a 255
short, 2 bytes, de -32767 a 32767
unsigned short, 2 bytes, de 0 a 65535
...
  #6 (permalink)  
Antiguo 12/04/2006, 09:49
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Cita:
Iniciado por MaxExtreme
En realidad,

char, 1 byte, de -127 a 127
unsigned char, 1 byte, de 0 a 255
short, 2 bytes, de -32767 a 32767
unsigned short, 2 bytes, de 0 a 65535
...
amigo Max, los valores char con signo almacenan desde -128 a +127. Esto es porque se pueden almacenar 128 valores positivos y 128 valores negativos, pero el 0 es considerado como positivo, por lo que no puede almacenar el numero +128

Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #7 (permalink)  
Antiguo 12/04/2006, 12:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por TolaWare
amigo Max, los valores char con signo almacenan desde -128 a +127. Esto es porque se pueden almacenar 128 valores positivos y 128 valores negativos, pero el 0 es considerado como positivo, por lo que no puede almacenar el numero +128

Saludos
Bueno, según estas Webs, que dicen guiarse por el ANSI-C, es como yo lo indico:

http://www.mailxmail.com/curso/infor.../capitulo4.htm
http://www.zator.com/Cpp/E2_2_1.htm


Aunque, por ejemplo, en esta de un manual de SQL y otro de Java, es como tú indicas:
http://www.aulaclic.es/sql/a_8_1_1.htm
http://www.geocities.com/CollegePark...8901/cap01.htm

Pero como hablamos de ANSI-C, creo que es como yo lo indico. Si puedo encontrar una referencia más fiable, te lo comento.
  #8 (permalink)  
Antiguo 12/04/2006, 13:49
Avatar de leoj90
Usuario baneado!
 
Fecha de Ingreso: agosto-2005
Mensajes: 1.365
Antigüedad: 18 años, 8 meses
Puntos: 0
Cita:
Iniciado por MaxExtreme
Bueno, según estas Webs, que dicen guiarse por el ANSI-C, es como yo lo indico:

http://www.mailxmail.com/curso/infor.../capitulo4.htm
http://www.zator.com/Cpp/E2_2_1.htm


Aunque, por ejemplo, en esta de un manual de SQL y otro de Java, es como tú indicas:
http://www.aulaclic.es/sql/a_8_1_1.htm
http://www.geocities.com/CollegePark...8901/cap01.htm

Pero como hablamos de ANSI-C, creo que es como yo lo indico. Si puedo encontrar una referencia más fiable, te lo comento.
¿Y entonces cuál agarro? jeje.
  #9 (permalink)  
Antiguo 12/04/2006, 13:53
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Bah, ninguno, son trivialidades que sólo te importarán en casos muy muy específicos.

A ver, si necesitas un entero, usa int tal cual. Con eso sobra, porque va desde -2147483647 (o 8 :P) a 2147483647. Rara vez necesitarás más que eso.

La velocidad del programa no se va a ver afectada, es más, si el procesador es de 32 bits algunos demostraban que era más rápido que manejar un número de 16 o 8.

Antes, la memoria era tan escasa que importaba, y era mejor usar un char que un short si era posible. Ahora, da igual, compras una pastilla de otros 512 mb y fuera.
  #10 (permalink)  
Antiguo 12/04/2006, 14:26
Avatar de GeoAvila
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Antigua Guatemala
Mensajes: 4.032
Antigüedad: 20 años, 4 meses
Puntos: 53
ahh esto de los benditos overflow salen cuando ha previsto la cantidad de datos de una variable..

pero bueno... ya esta la solucion...

nos vmeos..
__________________
* Antes de preguntar lee las FAQ, y por favor no hagas preguntas en las FAQ
Sitio http://www.geoavila.com twitter: @GeoAvila
  #11 (permalink)  
Antiguo 12/04/2006, 14:59
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por X_Cyclop
Ya decía yo que el Gorka no sabe.:-p

elrincondelc.com/cursoc/cursoc3.html#int

[Mejor sigo con el libro de Dennis y Brian]

Gracias.
En realidad, Gorka usaba el Turbo C de MS-DOS, que es de 16 bit.

En sistemas/procesadores de 16 bits, los int son de 16 bits, y por tanto, es como un "short int" de los de 32 bits.
  #12 (permalink)  
Antiguo 12/04/2006, 15:07
Usuario baneado!
 
Fecha de Ingreso: abril-2006
Mensajes: 3
Antigüedad: 18 años
Puntos: 0
Y bue... todo eso él no lo explica y por eso tengo problemas.

Gracias.
  #13 (permalink)  
Antiguo 12/04/2006, 15:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por X.Cyclop_
Y bue... todo eso él no lo explica y por eso tengo problemas.

Gracias.
Nada. ¿Cuántos nicks llevas creados? :P
  #14 (permalink)  
Antiguo 12/04/2006, 19:50
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Hay amigo Max, se que es un tema insignificante pero me hiciste entrar en la duda, asi que abri mi visual studio y lo confirme.

Al hacer un bucle que iba incrementando los valores de una variable char, daba la siguiente salida

124
125
126
127
-128
-127
-126

Por lo que deduzco que el char almacena valors entre -128 y 127.
Saludos
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #15 (permalink)  
Antiguo 12/04/2006, 20:36
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Ciertamente, he probado este código en VC++ 8.0

Código:
#include <iostream>

int main()
{
    for(short i=124;i<132;i++)
        std::cout << static_cast<int>(static_cast<char>(i)) << std::endl;
    std::cin.get();
    return 0;
}
Y la salida es en efecto:

Código:
124
125
126
127
-128
-127
-126
-125
Habría que probar en cygwin (port del gcc) o Dev-C++ (mingw32), a ver que dicen, pero ahora mismo no les tengo a mano. Luego les instalo y te comento.
  #16 (permalink)  
Antiguo 12/04/2006, 20:39
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
mm, es posible que si el codigo se compila para una arquitectura de 64 bits, esto cambie.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #17 (permalink)  
Antiguo 12/04/2006, 20:46
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por TolaWare
mm, es posible que si el codigo se compila para una arquitectura de 64 bits, esto cambie.
No debería, puesto que tratamos con 1 byte, y 1 byte sigue siendo 1 byte en procesadores de 8, 16, 32 o 64 bits.

Lo que sí cambia es el entero por defecto.

En sistemas 16 bits:
"int" son 16 bits, un ax por ejemplo.
"char" son 8 bits, un ah por ejemplo.

En sistemas 32 bits:
"int" son 32 bits, un eax por ejemplo.
"long int" es equivalente a "int", 32 bits también, un ebx, por ejemplo.
"short int" son 16 bits, un ax, por ejemplo.
"char" 8 bits un ah, por ejemplo.

En sistemas 64 bits (si Eternal Idol no me corrige :D)
"int" son 32 bits, como en el anterior, un eax, por ejemplo.
"long int" son 64 bits, un rax, por ejemplo.
"short int" son 16 bits, un ax, por ejemplo.
"char" son 8 bits, un ah, por ejemplo.

Aunque no sé si en Intel64 o AMD64 se puede acceder tal cual al eax, ax y ah como en los de 32 bits.

Pero en realidad no depende del sistema, sino del compilador. Por eso muchas veces lo mejor es trabajar con tipos específicos, con la siguiente nomenglatura. Simplemente unos typedefs o #defines harán el trabajo.

signed: int8, int16, int32, int64
unsigned: uint8, uint16, uint32, uint64

o en el caso de Windows: BYTE, WORD, DWORD, QWORD
  #18 (permalink)  
Antiguo 13/04/2006, 04:31
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
En varios cursos de programacion que hay por al red, siempre hacen referencia a que el tamaño de los tipos de datos está sujeto al tipo de arquitectura. Es por esto que pense que el tamaño del char, short, int, long, float, double, etc, pueden cambiar en una arquitectura de 64 bits.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #19 (permalink)  
Antiguo 13/04/2006, 05:48
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por TolaWare
En varios cursos de programacion que hay por al red, siempre hacen referencia a que el tamaño de los tipos de datos está sujeto al tipo de arquitectura. Es por esto que pense que el tamaño del char, short, int, long, float, double, etc, pueden cambiar en una arquitectura de 64 bits.
Si has leído por completo mi anterior mensaje, verás que no depende de la arquitectura, sino del compilador.

Y por otra parte, un char será siempre serán 8 bits, no hay vuelta de hoja, un short, 16 bits, un int, 32 bits, y un long dependerá del compilador si son 32 o 64 bits.

Por otro lado algunos compiladores de 32 bits ofrecen el tipo "long long" para hacer referencia a números de 64 bits.
  #20 (permalink)  
Antiguo 13/04/2006, 21:14
Avatar de TolaWare
Colaborador
 
Fecha de Ingreso: julio-2005
Mensajes: 4.352
Antigüedad: 18 años, 9 meses
Puntos: 24
Siempre que hablemos del lenguaje C/C++ estos tamalos pueden no cambiar.

Pero si nos movemos a JAVA, los datos ocupan el doble por lo general:
char: 2 bytes
int: 4 bytes
long: 8 bytes
...
Me fui del tema.
__________________
http://blog.tolaware.com.ar -> Blog de Java, Ruby y Linux
  #21 (permalink)  
Antiguo 14/04/2006, 00:41
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por TolaWare
Siempre que hablemos del lenguaje C/C++ estos tamalos pueden no cambiar.

Pero si nos movemos a JAVA, los datos ocupan el doble por lo general:
char: 2 bytes
int: 4 bytes
long: 8 bytes
...
Me fui del tema.
El char es de 2 bytes ya que usa Unicode, en C ese tipo de dato se suele emular con wchar_t (wide char).
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:32.