Puede sonar como una pregunta estúpida, pero tengo mucha curiosidad por saber cómo una computadora sabe que . Además, ¿cómo sabe una computadora que el orden de los enteros es 1 , 2 , 3 , 4 , 5 , ... y el alfabeto es A, B, C, D, ...? ¿Está almacenado en algún lugar en el hardware o el sistema operativo proporciona este tipo de información?
computer-architecture
reference-question
Ricky Stam
fuente
fuente
Respuestas:
Primero, sus números enteros se convierten en números binarios. Por ejemplo, el entero 2 se convierte a 0010.
La CPU utiliza un comparador digital :
En el hardware del comparador se utilizan algunas compuertas (AND, OR, NAND, NOR, XOR, etc.). Estas puertas toman entradas binarias y dan resultado en binario. La salida se puede ver desde una tabla de verdad.
Aquí
0
y1
son voltajes electrónicos para la puerta.1
- Representa un voltaje de umbral que indica un voltaje positivo.0
- Representa el voltaje por debajo del umbral.Por ejemplo, suponga que un comparador funciona con 5 voltios (se considera una explicación) y luego: el
voltaje de más de 3 voltios puede considerarse como
binary-1
.El voltaje por debajo de 3 voltios se considerará como
binary-0
Si una puerta obtiene una entrada como 3.5 voltios y otra entrada como 2 voltios, entonces considera que, toma una entrada como binaria 1 y otra entrada como binaria 0.
Estas secuencias de 1 y 0 se proporcionan muy rápidamente a través del circuito de conmutación.
El funcionamiento de un comparador digital de dos bits se puede expresar como una tabla de verdad:
Para citar de Wikipedia :
fuente
No solo "sabe", sino que siempre verifica. Básicamente, hace lo mismo que usted haría: para comparar, verifica (desde la izquierda) qué número tiene el primer dígito que es más grande que el correspondiente en el otro número. Por supuesto, debe agregar ceros iniciales al número más corto.
Las letras son solo números para la computadora. Los humanos han asignado números, por ejemplo, ASCII o Unicode , a letras para que las comparaciones de números también den el orden "correcto" para las letras.
fuente
No es el sistema operativo el que compara los enteros, la CPU se encarga de eso. Está hecho a nivel de puertas lógicas, consulte estas diapositivas para ver cómo se puede hacer.
Sobre el alfabeto, en ASCII , los caracteres alfanuméricos y otros caracteres especiales se representan como enteros, por lo que compararlos también es una operación de comparación de enteros, que realiza la CPU.
fuente
En realidad, y para obtener la imagen completa, creo que sería bastante útil ver con sus propios ojos la ruta de datos de una CPU real, por ejemplo MIPS:
Como puede ver, en realidad hay una segunda salida de la ALU, que es una señal llamada Cero. Existe para realizar operaciones de ramificación rápidas, después de determinar si los dos operandos de la comparación son iguales a cero o no , ya que la mayoría de las comparaciones dentro de un programa son sobre ramificaciones. Por lo tanto, cuando crea una posibilidad de ramificación en su código como:
si (a <b) {...}
Observe que la señal cero es una de las entradas de la compuerta AND que determina de dónde tomará el valor el contador de programa (PC): Suponiendo que la señal de rama es '1', ya que tenemos una operación de rama
Espero haberte ayudado a ver "debajo del capó". No dude en solicitar más análisis sobre este asunto. Muchas cosas damos por sentado, ¡las CPU las hacen de una manera muy fascinante!
fuente
Si quieres saber cómo lo hace una CPU real, es algo como esto.
Una CPU funciona con números de hasta un cierto tamaño. Hoy en día eso suele ser un número entero de 64 bits (ignoraremos los números de coma flotante; la idea será similar).
Entonces debemos reconocer que
Una CPU está almacenando números de hasta (digamos) 64 bits de largo en binario, en algún formato (probablemente un complemento de 2s pero no importa demasiado qué).
Una CPU no puede hacer nada de forma nativa con números más grandes que eso. Tenemos que escribir algoritmos de software si queremos comparar números más grandes.
Ahora, para números más grandes, tenemos que implementar algo en el software que utilizará estas pequeñas comparaciones como subrutinas.
fuente
Para responder a esta pregunta, permítanme señalar primero que hay al menos dos niveles de abstracción para los números de comparación en una computadora, el nivel de máquina y el nivel de software .
Comparar números a nivel de máquina
En la computadora de hoy, la CPU tiene un rico conjunto de instrucciones. Estas instrucciones incluyen, por ejemplo, cargar una celda de memoria en un registro, incrementar un registro, agregar dos registros y muchos más. También debe haber instrucciones para saltos condicionales . Por ejemplo, los procesadores de la familia x86 de Intel admiten las instrucciones
jnz
(salto si no es cero),jne
(salto no igual), etc. Si faltan, entonces la CPU no estaría completa en Turing. Las variables de las que depende el salto condicional se almacenan en los registros. Por lo tanto, estas instrucciones están cableadas en la arquitectura de la CPU como un circuito construido desde puertas lógicas. Esta es la única forma en que la CPU puede comparar dos números.Comparar números a nivel de software
Si compara dos números, digamos en un programa de c ++, esto se traduce en código de máquina y, por lo tanto, se lleva a cabo a nivel de máquina. Sin embargo, tal comparación puede ser más compleja. Realmente depende del tipo de datos que utilizó cómo se traduce la comparación al código de máquina. Solo un ejemplo, los números que desea comparar son de las palabras de 64 bits, pero su máquina solo funciona con 32 bits. Entonces este número no cabe en un registro, por lo tanto, el compilador desglosará la comparación en una secuencia de comparaciones en el nivel de código de máquina. Lo mismo se aplica para tipos de datos / estructuras de datos más complicados, que representan, por ejemplo, números racionales, cadenas o caracteres. Por lo tanto, cuando tiene que comparar dos caracteres, esto se traduce por software (sistema operativo, compilador, intérprete, ...) en código de máquina.
Como comentario final, quiero señalar que las CPU estándar también pueden funcionar con diferentes representaciones de números (enteros con signo en representación de complemento 1 o 2, flotantes). También se pueden realizar comparaciones en otras partes de la computadora, como la GPU.
fuente
otras respuestas son buenas, simplemente lanzando otra para mayor consideración / perspicacia con un sabor / giro CS. se puede construir un FSM , una máquina de estados finitos, que puede comparar dos números binarios de cualquier longitud, comenzando por pares desde los bits más significativos y trabajando hasta el bit menos significativo (LSB). también se puede usar para conceptualizar el comparador digital que se proporciona en otra respuesta, sin embargo, el FSM no requiere números binarios de longitud finita. incluso puede funcionar en enteros con fracciones binarias después del LSB. tiene un sabor inductivo y recursivo y puede demostrarse que es correcto por inducción simple. funciona de la siguiente manera:
en otras palabras, el número más grande es el que tiene la primera aparición de un bit que es uno y el otro es cero, después de una ejecución inicial de cero o más 1 idénticos. Un comparador digital de longitud finita hecho de compuertas o comparadores de 1 bit puede verse como basado en la fijación de la longitud de esta operación FSM a un número fijo de bits. (sí, existe una fuerte correspondencia entre todos los circuitos finitos y la "fijación de la longitud" de los cálculos de FSM).
Esto puede parecer un ejercicio teórico, pero en realidad, la lógica en el software para representar números de precisión arbitrarios opera de forma análoga a este FSM, excepto que está codificado en un bucle de computadora que puede verse como un bucle o simulando los pasos del FSM (una implementación eficiente podría rastrear a través de un índice la ubicación del MSB).
Además, razonablemente interpretemos / generalicemos esta pregunta como no limitada a enteros . la pregunta se refiere a números enteros pero el título solo se refiere a números. Sorprendentemente, nadie más ha mencionado la aritmética de coma flotante hasta ahora.
fuente