Variables 101: Conociendo tu computadora

Tristemente he visto que no muchos desean aprender a programar este 2018 🙁 pero aunque solo hubiese leído mi artículo anterior una persona y tras un poco de tiempo esta sea capaz de mandar un commit a algún proyecto de software libre, yo me daría por satisfecho con mi labor 🙂

Para los amantes de la seguridad, les prometo que el siguiente será un post sobre seguridad 🙂 así todos contentos, si alguno desea aprender otra cosa (como git, administración de servidores, o yo que sé :p ), o que comente algún otro tema que no pueda responderse de manera sencilla en el cuadro de comentarios, avísenme y vemos cómo podemos trabajarlo 😉

Bueno, ahora si vamos a lo nuestro, anteriormente hablamos sobre tipado, y que este tenía que ver con la forma en la que guardamos nuestras variables en un programa, ahora vamos a revisar un poco de qué ocurre en el interior y esperemos que pueda ser lo suficientemente claro.

Bits

Creo que este es un tema que siempre toco cuando escribo sobre programación, ciertamente es algo que me fascina y que me ha ayudado a comprender muchas cosas, ahora intentaré explicar un poco cómo son, cómo se leen, y para qué sirven 🙂

Piensen en un interuptor de luz, cuando el circuito está cerrado, tenemos un 0 en la pantalla, cuando cambiamos de posición el interruptor, pues un 1🙂 ¿sencillo no es cierto?

Ahora, un 0 y un 1 pueden significar muchas cosas, todo depende de la creatividad con que lo tomes, supongamos que yo quiero saber si alguien va a ir al Norte o al Sur, 1 puede significar norte y 0, sur 🙂 digamos que yo quiero saber si alguien es hombre o mujer, 1 puede ser hombre y 0, mujer 🙂 . Ahora quiero saber si esta persona es jóven o mayor (>22), 0 puede significar jóven y 1, mayor. Sigamos imaginando… ¿Tiene alguna mascota? 1 diría que sí, mientras que 0 diría que no. Ahora quiero que lean conmigo la siguiente línea:

1001

Esto es la forma breve de decir…

Una jóven mujer de no más de 22 años se dirige al norte acompañada de su mascota.

lo que es muy diferente a:

0110 o Un hombre con más de 22 años de edad se dirige solo hacia el sur.

Bytes

Ahora vamos a ir un paso adelante, vamos a aprender a leer bytes. Un byte es la sucesión de 8 bits, los cuales se leen de derecha a izquierda y cada 1 representa una potencia de 2 elevado a la n donde n es la posición del bit. Como suena a chino, vamos a poner un pequeño ejemplo 🙂

01001011 Tenemos este byte, ahora vamos a ir de derecha a izquierda ( <- ) yo voy a ponerlos de arriba a abajo para poder escribir su signifiacdo:

1: el bit al estar en la posición 0 nos indica que tenemos lo siguiente 2 elevado a la cero o 2^0. Esto bien sabemos que equivale a 1.

1: el segundo bit, ahora la posición 12^1 que es lo mismo que decir 2

0: tercer bit… aquí debería ser 2^2, mas como no está encendido, vamos a dejarlo en 0

1:cuarto bit, 2^3 u 8 🙂

0: lo mismo que 0

0: otro 0

1:ahora estamos en 2^6 o 64

y finalmente 0 , que ya sabemos lo que significa 🙂 ahora vamos a sumar nuestros resultados y compararlos con la siguiente tabla 🙂 Tenemos un 75 por lo que vamos a buscarlo en la columna Decimal y veremos lo que aparece en Char

Resultado de imagen para ascii table

¡¡Tenemos una K!! Felicidades, ya saben leer en binario 🙂 Pero los más sagaces habrán podido notar que también hemos obtenido un número decimal, y que este tiene un límite (cuando todos los valores son 1) Ese límite se encuentra en el número 255.

Word

Ahora más de uno me dirá, pero ¿qué pasa si necesito un número mayor a 255? o ¿dónde puedo encontrar otros caractéres como los japoneces? Pues la respuesta es simple, juntemos 2 bytes. Ahora que tenemos dos, la cantidad posible de combinaciones que tenemos es 2^16 o 65536 posibles resultados, como el 0 es uno de esos, el máximo posible es 65535. ¿A alguno le suena ese número? ¿Recuerdan la cantidad máxima de puertos en un sistema linux? Se los dejo de tarea 😉

Double word & quad word

Para los más matemáticos también existen formatos específicos, los double word contienen, como muchos ya habrán imaginado 2 word o 4 bytes (o 32 bits) de información, lo mismo que decir:

11111111111111111111111111111111 o de 0 a 4 294 967 295

A estas alturas muchos se preguntarán qué sucede con los números negativos, es decir, en algún lugar deben estar contemplados ¿no es cierto? Para poder almacenar un número negativo, los desarrolladores de procesadores eligieron ocupar el primer bit de la izquierda como un valor de signo. Esto quiere decir que si el primero bit es 0 hablamos de un número positivo, pero si es 1 tenemos un negativo. Ahora ven por qué los bits son tan especiales, pueden ser lo que tu quieras 😀

¡Pero esto evidentemente nos deja con una posición menos para realizar la multiplicación! Por lo que nuestro0 a 4 294 967 295 se convierte en:

-2,147,483,648 a +2,147,483,647

Ahora bien, muchos ya tenemos procesadores de 64 bits, y este es el valor de un quad word, podemos tener valores que van desde el 0 a 18 446 744 073 709 551 615. Ese sí es un número grande 🙂

¿Por qué 8 bits?

Esto es algo que ya más de uno se estará preguntando, y la respuesta está en el hardware. Desde su origen, los procesadores necesitaban data para poder realizar operaciones. La data se almacena en la memoria de la computadora y cada vez que el procesador la requiere utiliza los buses de data para conseguirla. En la antigüedad, estos buses podían comunicar un máximo de 8 bits por ciclo, esto quiere decir que el máximo y más eficiente modo de mover data, era agrupando 8 bits y mandando estos al procesador.

Con el paso del tiempo, hasta el día de hoy, los procesadores han desarrollado la hablidad de mover 16 bits, 32bits y… 64 bits.

¿Qué tiene que ver con el tipado?

Ya llegamos a la parte donde todo cobra sentido 🙂 El tipado es una propiedad que utilizan los lenguajes de programación para denominar estos espacios de memoria. Todas las variables tienen su contraparte en alguno de estos tipos de data, sin importar cómo sean llamadas. Estos se conocen como tipos de dato primitivos, cada lenguaje fuertemente tipado tiene su concepción de estos valores, y la cantidad que representan. Por ejemplo en C tenemos la biblioteca limits.h que nos muestra la cantidad máxima y mínima de los valores primitivos.

Veamos lo que sucede si intentamos romper uno de los valores:

Diseño propio. Christopher Díaz Riveros

A la derecha tenemos los valores del archivo limits.h y a la izquierda hemos tomado uno de estos valores (unsigned short int) y le hemos asignado un número mayor al correspondiente. Como resultado el compilador nos advierte que estamos utilizando mal la memoria porque la forma binaria de 66666 no puede caber en la forma binaria de 65535. Esto nos lleva a una lección de performance cuando programamos, si tu valor no va a crecer mucho a lo largo del tiempo, o si no requieres valores tan grandes como los de un double o quad word, utilizar el tipo correcto reduce la cantidad de memoria solicitada por el CPU, lo que implica una mayor velocidad de obtención de data si está bien calculada.

En el lado de los intérpretes esto es más sencillo debido a las conversiones implícitas. Cuando definimos una variable en lenguajes como javascript o Python, el intérprete se encarga de entender qué tipo es, y asignar el espacio suficiente de memoria para realizar las operaciones. Veamos un ejemplo sencillo 🙂

Diseño propio. Christopher Díaz Riveros

Como pueden ver, no tenemos que explicar al intérprete de python el tipo de nuestra variable, porque él mismo se encarga de asignar un tipo y almacenarlo en memoria 🙂

Conoce tus variables

Esto depende del lenguaje y tipo de implementación que vayas a utilizar, pero el primer paso para poder programar es aprender las variables que puedes utilizar 🙂 Una vez comprendas las variables, estarás en situación de poder utilizarlas de manera eficiente y lógica para almacenar información (provista por un usuario o por el sistema). Este es el primer paso en la escalera de la programación y con suerte, tras leer este artículo, habrás comprendido un poco mejor cómo es que funciona tu computadora y cómo almacena la información. Conmigo será hasta el siguiente artículo, recuerden dejar sus comentarios para saber si hay que reforzar o comentar algún punto en específico. Saludos


41 comentarios, deja el tuyo

Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

  1.   Luis dijo

    Bien escrito, sucinto y claro, a la vez de interesante para todos los públicos. Buen trabajo.

    1.    ChrisADR dijo

      Muchas gracias, saludos 🙂

  2.   Juan Jesús dijo

    Genial explicación. Eres un máquina.

    1.    ChrisADR dijo

      Gracias 🙂

  3.   Ruben dijo

    Muy bien explicado gracias

    1.    ChrisADR dijo

      Gracias a ti por leerlo completo 🙂

  4.   Diego dijo

    Excelente, gracias por el aporte. Y aprovechando el tema binario consulto, hay posibilidad que nos des una clase de IP, subnet, etc. Entiendo que no es un tema de programación, pero siempre me ha quedado pendiente una buena explicación de ese tema.
    De nuevo, gracias por tu explicación

    1.    ChrisADR dijo

      Hola Diego, pues se puede hacer 🙂 a decir verdad yo tampoco he entrado mucho en el tema, pero no hay mejor forma de investigar que buscando algo que compartir al respecto en un artículo 🙂 Lo dejaremos para la lista porque el siguiente post ya tiene tema y va a tratar sobre hardening. Saludos 🙂

  5.   Pedro dijo

    Sos un profesor excelente, y muy generoso por enseñar lo que sabés. Felicitaciones y gracias.

    1.    ChrisADR dijo

      Muchas gracias Pedro 🙂 todavía sigo buscando lugares donde enseñar, lamentablemente aquí en Perú es difícil cuando solo tienes un título de profesional técnico, por eso ahora estoy viendo la posibilidad de continuar mis estudios universitarios aquí o donde se pueda o incluso aplicar a alguna maestría en el extranjero,quien sabe, tal vez pronto se pueda dar algo así 🙂 pero definitivamente enseñar es algo que me alegra el día 🙂 Saludos

  6.   something dijo

    no habia leido mejor explicacion del tema, el primer ejemplo es brillante

    aunque tampoco habia escuchado eso de word (como variables 16 bits), double word, o cuad word

    sin importar que «ya programe», los post son interesantes. Si ha de tener alguna pega el post es utilizar C (limits.h) como ejemplo de los tamaños de variables, C tiene la especificacion menos especifica que existe

    1.    ChrisADR dijo

      Hola something 🙂 muchas gracias, se me ocurrió en el camino el ejemplo 😛 pues ciertamente son datos conocidos para los que han leído un poco de Assembly, y eso es lo que el procesador entiende 🙂 jajaja ciertamente C es poco específico, pero creo que se debe al hecho de que la portabilidad y las diferentes arquitecturas que soporta han sido tan variadas que C tiene que acomodarse a cada tipo de procesador para ser realmente portable 🙂
      Saludos y gracias por compartir.

  7.   Sergio dijo

    Unnn seria interesante que esta serie de tutoriales se basaran en rust, creo que es uno de los lenguajes mas interesantes que se están desarrollando hoy en día.
    Yo ando detrás de el , pero reconozco que es un lenguaje difícil , pero con mucho futuro…
    Espero tus siguientes artículos , son realmente interesantes.
    Saludos.

    1.    ChrisADR dijo

      Hola Sergio, ciertamente sería interesante, he oído que GNOME está planeando implementar Rust dentro de su conjunto de programas, todavía no he visto al máximo el alcance que pretenden, pero si que se avecina una migración.
      En cuanto a lenguajes, yo personalmente todavía estoy aprendiendo C, quiero poder empezar a desarrollar en el kernel en los próximos meses, y prefiero aprender a profundidad pocos lenguajes antes de empezar a revisar nuevos, pero definitivamente puedo buscar algo interesante y hacer unos cuantos ejemplos en Rust, puesto que su documentación se ve bastante bien por sí misma.
      Saludos y gracias por compartir 🙂

  8.   David dijo

    Muy buenas explicaciones, tanto las de este artículo como las del anterior. Espero que sigas con esta temática que me resulta muy interesante.

    1.    ChrisADR dijo

      Hola David, yo también espero poder seguir escribiendo y sobre todo motivando a personas a participar con el software libre, hay tantos proyectos y necesidades ahora que contar con unas cuantas manos extra para desarrollar sería estupendo 🙂
      Saludos

  9.   Mart dijo

    Podrías hacer un post sobre la máquina de Turing?

    1.    ChrisADR dijo

      Hola Mart 🙂 creo que en algún comentario lo hemos tocado antes ¿no es cierto? seguro que puedo armar algo interesante sobre le tema 🙂 vamos a ver lo que puede salir. Saludos y gracias por leer todos mis artículos, desde el primer día hasta hoy siempre te he visto bastante interesado 🙂

  10.   ALLAN LARA dijo

    Wow, muchas gracias que buena explicación.

    Saludos

    1.    ChrisADR dijo

      Muchas gracias Allan 🙂 saludos

  11.   Ramon Hidalgo dijo

    ¡Yo leí tu post anterior ! Muchas gracias por la explicación, aunque creo que nunca voy a terminar de entender el «word».

    1.    ChrisADR dijo

      Hola Ramon 🙂 muchas gracias por leer ambos. Si de algo sirve, el «word» es la evolución de un byte, es como los procesadores, antes habían de 8-bits, después de 16-bits, etc… esto es porque cada vez requerimos más espacio para procesar y mejor velocidad o potencia… el ‘word’ nació porque el espacio del ‘byte’ se quedó corto, y lo mismo con el ‘double’ y ‘quad’ word 🙂 es la evolución natural que hace que agreguemos potencia y espacio para poder seguir desarrollando 🙂

      Saludos

  12.   Anónimo dijo

    Este 2018 aprendo a programar si o si, gracias

    1.    ChrisADR dijo

      Me alegra 🙂 esfuérzate mucho!! Saludos

  13.   Guillermo dijo

    Muchas gracias, sigue así. Ya sé programar pero espero tus enseñanzas, que mi programación autodidacta está llena de malas prácticas.

    1.    ChrisADR dijo

      Gracias Guillermo 🙂 Pues ojalá encuentres cosas interesantes también en los siguientes posts 🙂 Saludos

  14.   Edgar dijo

    Una explicación sencilla siempre es la mejor.. excelente..
    Yo propondría git… para los programadores es básico cuando quieres trabajar en equipo y poner orden a tu trabajo.. a las versiones..

    1.    ChrisADR dijo

      Muy cierto Edgar, intentaré publicar contenido al respecto, aunque es bastante difícil decir algo nuevo porque la documentación de git ya de por sí es abundante y varias cosas ya están traducidas a varios idiomas. Veré que puedo hacer, saludos y gracias por compartir

  15.   Tiririri dijo

    Hola, ¿el número de 0 a 18 446 744 073 709 551 615 corresponde al valor decimal de 64 bits o se refiere a otro valor?, pues calculando la potencia de 2^64, el resultado que obtengo es: 18 446 744 073 709 552 000.

    1.    ChrisADR dijo

      Hola Tiririri, creo que estas teniendo un problema de redondeo, puedes intentar usar el comando bc? es un lenguaje de programación diseñado para tener la mayor precisión posible, una vez dentro del mismo tan solo es necesario hacer 2^64, tal vez eso lo resuelva 🙂 me avisas qué tal te fue, saludos

      PS. El valor real es 18 446 744 073 709 551 616, pero estamos restando 1 porque el 0 cuenta como valor posible 🙂

      1.    Tiririri dijo

        Gracias, eso lo calculé con una calculadora de potencias que encontré en la red (https://es.calcuworld.com/calculadoras-matematicas/potencias/) y ese fue el resultado que me dio.
        Y sí, ya probé con el comando bc, y efectivamente me da el valor que tú anotaste.

  16.   Tiririri dijo

    Hola otra vez, la imagen donde refieres la biblioteca limits.h es muy pequeña y no se puede leer (al menos yo no pude leerla, pues veo que todo mundo sí lo hizo, según parece), y como no la entiendo ya no continué leyendo. No se si pudieras cambiarla, espero no molestarte con eso.

    1.    ChrisADR dijo

      Puedes probar la versión de celular, esas se ven un poco más claras, es un tema de wordpress :/ por otra parte, todas los headers de C pueden encontrarse en /usr/include/ , en este caso puedes optar por leerla directamente si te es más sencillo 🙂 voy a intentar subir una imágen más grande para ver si ayuda 🙂

      1.    Tiririri dijo

        Gracias, creo que debo tener paciencia con esto, je je.

  17.   Katekyo dijo

    Gracias por el articulo ya q ahora comprendí un poco mejor las variables y rango de representación de un lenguaje y pero ahora creo q deberé empezar a utilizar la librería «stdint.h» ya que la recomiendan para usar cuando se programa en c ya que a mi me habían enseñado a la vieja escuela ya que la memoria era preciada y uno debía ser cuidadoso con lo que se usaba

    1.    ChrisADR dijo

      No hay de qué Katekyo, ciertamente es mejor usar la librearía estándar, pero te puedo asegurar que es mejor saber qué distingue a un uint_least8_t de un uint_fast8_t y eso se consigue conociendo los tipos de dato primitivos, lo cual era el objetivo del post 🙂 Muchas gracias por el comentario y por leer el artículo, saludos

  18.   victor dijo

    :O una explicación magistral! sabia parte de los conceptos pero saco mucho conocimiento nuevo de este post

    1.    ChrisADR dijo

      Muchas gracias Victor 🙂 qué bueno que pueda ser de ayuda el artículo, saludos

  19.   Guille dijo

    Python me gustó mucho para facilitar la programación, vi un curso en http://zetcode.com/gui/pyqt4/ del que me encantó el tetris final: http://zetcode.com/gui/pyqt4/thetetrisgame/
    Este tetris lo retoqué durante un verano para ponerle puntos, multijugador y música, poco a poco, pero muy entretenido.

    1.    ChrisADR dijo

      Hola Guille, ciertamente es muy entretenido ver crecer poco a poco el software que estás trabajando 🙂 es una experiencia incomparable, y más aún cuando alguien encuentra útil lo que estás desarrollando, eso es de otro mundo 😀 muchas gracias por compartir 🙂

      1.    Guille dijo

        El que hice lo he subido (30Mb por la musiquita) a http://guillermo.molleda.com/Tetris9.7z
        Tiene para configurar una velocidad inicial distinta a cada jugador o si reinicia puntos tras nueva partida, …, y son tres jugadores para que jugaran mis dos hijas conmigo. Es hasta adictivo.