Básicamente, cada computadora moderna es una máquina de empuje de bits. Por lo general, empuja bits en grupos de datos, llamados bytes, palabras, dwords o qwords.
Un byte consta de 8 bits, una palabra de 2 bytes (o 16 bits), una palabra d de 2 palabras (o 32 bits) y una palabra q de 2 dwords (o 64 bits). Estas no son la única forma de organizar los bits. También se produce manipulación de 128 bits y 256 bits, a menudo en las instrucciones SIMD.
Las instrucciones de ensamblaje operan en registros y las direcciones de memoria generalmente operan en una de las formas anteriores.
Las ALU (unidades lógicas aritméticas) operan en paquetes de bits como si representaran números enteros (generalmente el formato Complemento de dos) y las FPU como si tuvieran valores de coma flotante (generalmente estilo IEEE 754 float
ydouble
). Otras partes actuarán como si fueran datos agrupados de algún formato, caracteres, entradas de tabla, instrucciones de CPU o direcciones.
En una computadora típica de 64 bits, los paquetes de 8 bytes (64 bits) son direcciones. Mostramos estas direcciones convencionalmente como en un formato hexadecimal (como0xabcd1234cdef5678
), pero esa es solo una manera fácil para que los humanos lean los patrones de bits. Cada byte (8 bits) se escribe como dos caracteres hexadecimales (de manera equivalente, cada carácter hexadecimal - 0 a F - representa 4 bits).
Lo que realmente está sucediendo (para cierto nivel) es que hay bits, generalmente almacenados en un registro o almacenados en ubicaciones adyacentes en un banco de memoria, y solo estamos tratando de describirlos a otro humano.
Seguir un puntero consiste en pedirle al controlador de memoria que nos brinde algunos datos en esa ubicación. Por lo general, le pediría al controlador de memoria un cierto número de bytes en una ubicación determinada (bueno, implícitamente un rango de ubicaciones, generalmente contiguas), y se entrega a través de varios mecanismos en los que no entraré.
El código generalmente especifica un destino para los datos que se van a buscar (un registro, otra dirección de memoria, etc.) y, por lo general, es una mala idea cargar datos de punto flotante en un registro esperando un número entero, o viceversa.
El tipo de datos en C / C ++ es algo que el compilador realiza un seguimiento y cambia el código que se genera. Por lo general, no hay nada intrínseco en los datos que lo haga realmente de cualquier tipo. Solo una colección de bits (organizados en bytes) que el código manipula de forma entera (o de forma flotante, o de dirección).
Existen excepciones para esto. Hay arquitecturas donde ciertas cosas son un tipo diferente de bits. El ejemplo más común son las páginas de ejecución protegidas: mientras que las instrucciones que le dicen a la CPU qué hacen son bits, en el tiempo de ejecución, las páginas (de memoria) que contienen código para ejecutar están marcadas especialmente, no pueden modificarse y no puede ejecutar páginas que no están marcadas como páginas de ejecución.
También hay datos de solo lectura (a veces almacenados en ROM que no se pueden escribir físicamente), problemas de alineación (algunos procesadores no se pueden cargar double
s de la memoria a menos que estén alineados de manera particular, o instrucciones SIMD que requieren cierta alineación), y una miríada de Otras peculiaridades de la arquitectura.
Incluso el nivel de detalle anterior es una mentira. Las computadoras no están "realmente" presionando bits, realmente están presionando los voltajes y la corriente. Estos voltajes y corrientes a veces no hacen lo que se supone que deben hacer en el nivel de abstracción de bits. Los chips están diseñados para detectar la mayoría de estos errores y corregirlos sin que la abstracción de nivel superior tenga que ser consciente de ello.
Incluso eso es una mentira.
Cada nivel de abstracción oculta el siguiente y le permite pensar en resolver problemas sin tener que tener en cuenta los diagramas de Feynman para imprimir "Hello World"
.
Entonces, con un nivel suficiente de honestidad, las computadoras empujan bits, y esos bits tienen significado por cómo se usan.