Duda: Conocer tipo de dato

carracho

Buenas,

Traigo esta duda a ver si alguien me ayuda a resolverla.
En un código como:

char a = 22;
if (a == 42) { ... }

¿que tipo de dato es '42'? ¿un char? ¿un int? ¿un unsigned int? ¿otra cosa más ajustada a la cantidad de bits que realmente necesita para representar el valor?

EDIT: Este comentario se ha editado... debido a que no me interesa el aspecto de 'con signo' o 'sin signo'. Antes de #5 el ejemplo era:

Ver anterior ejemplo

** Antes del edit tampoco se hacia la pregunta "¿un char?"

pardier

le tienes que dar a propiedades

Dr_Manhattan

42 es un literal entero (en C++ se convierten a int por defecto), pero después se convierte a unsigned int para la comparación

1 1 respuesta
Apo_powa

https://letmegooglethat.com/?q=unsigned+integer

Has probado a googlear?

carracho

He cambiado el tipo de dato para que no distraiga si es con o sin signo...

#3 Entiendo que lo que dices es que el compilador al final deja '42' como el dato que compara... ¿no?
EDIT: (bueno, realmente no puede aplicar esa política el 100% de la veces... ¿si el valor (42 en el ejemplo) fuese enorme, un long long...?)

1 respuesta
Dr_Manhattan

#5 No, no sé en otros lenguajes, pero en C++ se cambian los tipos de dato en base a una jerarquía, puede que el segundo sea "más importante" para el compilador y el que cambie de tipo sea el primero

1
Dr_Manhattan

Cabrón, has editado #1 poniendo ahora el a como un char, antes lo tenías como unsigned int.

1 respuesta
carracho

#7 Si lo comenté en #5 jeje porque veía que se pillaba el asunto por un camino que no era el que quería... mi duda es por la cantidad de bits que ocupa ese dato '42'.

1 respuesta
Dr_Manhattan

con los ninjaedits que estás metiendo en todos los post paso de comentar más, que te vaya bien

1 respuesta
carracho

#9 Reflejados los edits... no es mi intención "falsear" nada, no lo he dejado porque no veo que aporte nada... pero si veo que molesta, lo pongo sin problema.

Gif

#8 depende del compilador que estés usando un 42 puede ser interpretado como int o en otro compilador podría ser un long etc, si quieres que sea de x tipo ponlo de forma explicita.

1
sergioRG

Algunos compiladores lo enchufan en una dword de 32, otros lo empaquetan en bytes que se direccionan por separado, también en función de si se necesita padding por tema de múltiplos o no la respuesta puede variar, y también depende de la arquitectura.

Si te pica la curiosidad compila ese código para diferentes arquitecturas y mira el objdump, ahí viendo al tipo de registro al que se hace el mov también te debería dar una pista

1
carracho

Por lo que veo, como ha comentado @Dr_Manhattan (que no se porque se ha mosqueado tanto xD) según la especificación de C, en este caso caería en un 'int', aunque el tipo de dato que compara es un char... me resulta curioso que el tipo de dato (edit: más bajo) para una constante entera sea 'int' y no 'char'. Pero seguramente sea porque me falta calle xDD

https://en.cppreference.com/w/c/language/integer_constant

1 respuesta
Dr_Manhattan

#13 No me he mosqueado, pero veo que editabas y mis respuestas dejaban de ser válidas, luego he entrado a tu perfil y he visto este hilo
https://www.mediavida.com/foro/dev/proyecto-mirlo-otro-sencillo-javascript-web-component-707279#7

1 respuesta
carracho

#14 Soy así... pero no lo hago con maldad. Edito rápido porque releo lo que escribo y digo, mierda... puta dislexia me he comido esta letra o directamente me he comido toda una frase :B

Tranquilo, este no lo borro... el otro lo "borre" porque me da palo hablar solo... y ya lo hago en otro hilo que tengo en Música. Me siento bastante estupido... y por eso lo he editado. Esa, es la historia de mi vida.

1

Usuarios habituales

  • carracho
  • Dr_Manhattan
  • sergioRG
  • Gif
  • Apo_powa
  • pardier