Si las máquinas de 32 bits solo pueden manejar números de hasta 2 ^ 32, ¿por qué puedo escribir 1000000000000 (billones) sin que mi máquina falle?

369

Las computadoras de 32 bits solo pueden almacenar enteros firmados hasta 2 31 - 1.
Es por eso que nos hemos quedado sin direcciones IPv4 y hemos entrado en la era de 64 bits.

Sin embargo, el número 2 31 - 1 (2,147,483,647) no es tan grande como el número 1 trillón (1,000,000,000,000) que parece que puedo mostrar bien sin que mi máquina se caiga.

¿Alguien puede explicar por qué es esto?

Ben Johnson mk2
fuente
35
La pregunta es defectuosa. Las máquinas de 32 bits pueden manejar números mucho más grandes que 2 ^ 32. Lo hacen todo el tiempo, con 'largo' y así sucesivamente. Solo pueden almacenar hasta 2 ^ 32 en un registro, pero el software está escrito para evitar este problema. Algunos idiomas modernos ni siquiera tienen un problema con la longitud de un número dado.
JFA
23
Mantenga comentarios sobre el tema, corteses y relevantes para los aspectos técnicos de la pregunta. Ya se tuvieron que eliminar casi 50 comentarios de broma, y ​​nos gustaría evitar tener que bloquear la publicación. Gracias.
nhinkle
66
Esta pregunta ha sido escrita de una manera un poco descuidada. ¿Qué quiere decir con "escribir" y "mostrar" el número 1000000000000? Cuando escribió la pregunta, escribió el número 1000000000000, y su navegador web lo muestra muy bien, supongo, pero esto no debería ser nada extraño para cualquiera que haya usado una computadora antes. La pregunta pide interpretación libre.
HelloGoodbye
77
Se estima que la conciencia humana tiene unos 50 bits (leí en alguna parte). Entonces la pregunta no es "¿Cómo puedo escribir 10^9sin que mi PC se caiga?" sino más bien "¿Cómo puedo escribir 10^(18)sin que mi cerebro se estrelle?"
Hagen von Eitzen
1
Las computadoras de 32 bits solo pueden almacenar enteros SIN FIRMAR hasta 2 ^ 32 - 1. 2 ^ 32 - 1 ni siquiera es igual a 2,147,483,647 ... 300 votos positivos y nadie se dio cuenta de esto.
Koray Tugay

Respuestas:

784

Respondo tu pregunta preguntándote una diferente:

¿Cómo cuentas con tus dedos hasta 6?

Probablemente cuente hasta el mayor número posible con una mano, y luego pase a la segunda mano cuando se le acaben los dedos. Las computadoras hacen lo mismo, si necesitan representar un valor mayor que el que puede contener un solo registro, usarán múltiples bloques de 32 bits para trabajar con los datos.

Scott Chamberlain
fuente
16
Divertido, @codename. Entonces, ¿cómo cuenta con sus dedos hasta 32 o más (es decir, una vez que 2 ^ 5 está agotado)? ;) La analogía de moverse a la otra mano es buena ... incluso si el binario retrasa la necesidad de moverse a la otra mano. Lo que me gustaría ver es contar hasta 1,024 o más con la destreza pedial para moverse hasta los dedos de los pies para contar más en binario, ¡hasta 1,048,575! :) Eso es potencialmente 20 bits de potencia de placa secundaria. : P
J0e3gan
14
Mantenga comentarios sobre el tema y relevantes para discutir los aspectos técnicos de esta respuesta. Ya se han eliminado más de 60 comentarios de broma de esta respuesta, y nos gustaría evitar tener que bloquear la publicación.
nhinkle
@ codename- easy, asigna un dedo como puntero de pila. Una vez que te quedas sin dedos, agregas la cantidad a la pila y comienzas a contar.
Makach
¿Dónde aprendiste eso, @codename? Escuché esto primero de Frederik Pohl, ver, por ejemplo, aquí hjkeen.net/halqn/f_pohl3.htm
Zane
2
Creo que esta no es la respuesta a la pregunta relevante. La respuesta de @ Bigbio2002 es la correcta. Aquí "1000000000000" no es un número sino un texto, al igual que "adsfjhekgnoregrebgoregnkevnregj". Lo que está diciendo es cierto, pero creo firmemente que esta no es la respuesta correcta. Y para ver tantos votos a favor ...
Jefe Maestro
398

Tiene razón en que un número entero de 32 bits no puede contener un valor mayor que 2 ^ 32-1. Sin embargo, el valor de este número entero de 32 bits y cómo aparece en su pantalla son dos cosas completamente diferentes. La cadena impresa "1000000000000" no está representada por un entero de 32 bits en la memoria.

Para mostrar literalmente el número "1000000000000" se requieren 13 bytes de memoria. Cada byte individual puede contener un valor de hasta 255. Ninguno de ellos puede contener todo el valor numérico, pero interpretado individualmente como caracteres ASCII (por ejemplo, el carácter ' 0' está representado por el valor decimal 48, valor binario 00110000), pueden estar unidos en un formato que tenga sentido para ti, un humano.


Un concepto relacionado en la programación es el encasillado , que es cómo una computadora interpretará un flujo particular de 0sy 1s. Como en el ejemplo anterior, se puede interpretar como un valor numérico, un personaje o incluso algo completamente diferente. Mientras que un número entero de 32 bits puede no ser capaz de mantener un valor de 1000000000000, un número de coma flotante de 32 bits sí podrá hacerlo, utilizando una interpretación completamente diferente.

En cuanto a cómo las computadoras pueden trabajar y procesar grandes cantidades internamente, existen enteros de 64 bits (que pueden acomodar valores de hasta 16 billones de billones), valores de punto flotante, así como bibliotecas especializadas que pueden trabajar con arbitrariamente grandes números.

Bigbio2002
fuente
22
En realidad, eso es correcto, pero no del todo. Es poco probable que un número de coma flotante de 32 puntos pueda representar con precisión 1000000000000. Representará un número muy muy cercano al número deseado pero no exactamente.
Tim B
66
@TimB: ¿Has oído hablar del formato decimal32? Es parte del estándar IEEE 754-2008. Este formato es capaz de representar correctamente este número :)
VX
15
Es cierto que eso puede. Sin embargo, ese no es el formato al que se refieren las personas cuando dicen "flotante", que generalmente se refiere a un número de coma flotante de 32 bits almacenado y utilizado por los procesadores de coma flotante estándar en las computadoras actuales.
Tim B
2
@TimB de hecho. El número más cercano al que puede representarse como float32 es 999999995904
greggo
44
@TimB: Pero un número de coma flotante de 64 bits puede representar fácilmente 1000000000000exactamente. Son 10 ^ 12, o 2 ^ 12 * 5 ^ 12; 5 ^ 12 requiere 28 bits de mantisa.
Keith Thompson el
191

En primer lugar, las computadoras de 32 bits pueden almacenar números de hasta 2³²-1 en una sola palabra de máquina . La palabra máquina es la cantidad de datos que la CPU puede procesar de forma natural (es decir, las operaciones con datos de ese tamaño se implementan en hardware y generalmente son más rápidas de realizar). Las CPU de 32 bits utilizan palabras que consisten en 32 bits, por lo que pueden almacenar números del 0 al 2³²-1 en una palabra .

Segundo, 1 billón y 1000000000000 son dos cosas diferentes.

  • 1 billón es un concepto abstracto de número
  • 1000000000000 es texto

Al presionar 1una vez y luego 012 veces, está escribiendo texto. 1entradas 1, 0entradas 0. ¿Ver? Estás escribiendo personajes. Los personajes no son números. Las máquinas de escribir no tenían CPU ni memoria y manejaban esos "números" bastante bien, porque es solo texto.

Prueba de que 1000000000000 no es un número, sino texto: puede significar 1 billón (en decimal), 4096 (en binario) o 281474976710656 (en hexadecimal). Tiene aún más significados en diferentes sistemas. El significado de 1000000000000 es un número y almacenarlo es una historia diferente (volveremos a ello en un momento).

Para almacenar el texto (en la programación se llama cadena ) 1000000000000 necesita 14 bytes (uno para cada carácter más un byte NULL de terminación que básicamente significa "la cadena termina aquí"). Eso son 4 palabras de máquina. 3 y medio sería suficiente, pero como dije, las operaciones con palabras de máquina son más rápidas. Asumamos ASCII se utiliza para el almacenamiento de texto, por lo que en la memoria se vería así: (conversión de códigos ASCII correspondientes a 0y 1a binario, cada palabra en una línea separada)

00110001 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00110000 00110000 00110000
00110000 00000000 00000000 00000000

Cuatro caracteres caben en una palabra, el resto se mueve a la siguiente. El resto se mueve a la siguiente palabra hasta que todo (incluido el primer byte NULL) encaje.

Ahora, de vuelta al almacenamiento de números. Funciona igual que con el texto desbordado, pero se ajustan de derecha a izquierda. Puede sonar complicado, así que aquí hay un ejemplo. En aras de la simplicidad, supongamos que:

  • nuestra computadora imaginaria usa decimal en lugar de binario
  • un byte puede contener números 0..9
  • una palabra consta de dos bytes

Aquí hay una memoria vacía de 2 palabras:

0 0
0 0

Guardemos el número 4:

0 4
0 0

Ahora agreguemos 9:

1 3
0 0

Observe que ambos operandos cabrían en un byte, pero no el resultado. Pero tenemos otro listo para usar. Ahora almacenemos 99:

9 9
0 0

Nuevamente, hemos usado el segundo byte para almacenar el número. Agreguemos 1:

0 0
0 0

Whoops ... Eso se llama desbordamiento de enteros y es la causa de muchos problemas graves, a veces muy caros .

Pero si esperamos que ocurra un desbordamiento, podemos hacer esto:

0 0
9 9

Y ahora agregue 1:

0 1
0 0

Se vuelve más claro si elimina espacios de separación de bytes y líneas nuevas:

0099    | +1
0100

Hemos predicho que puede ocurrir un desbordamiento y es posible que necesitemos memoria adicional. Manejar números de esta manera no es tan rápido como con los números que se ajustan a una sola palabra y debe implementarse en un software. Agregar soporte para números de palabras de dos bits de 32 bits a una CPU de 32 bits efectivamente lo convierte en una CPU de 64 bits (ahora puede operar en números de 64 bits de forma nativa, ¿verdad?).

Todo lo que he descrito anteriormente se aplica también a la memoria binaria con bytes de 8 bits y palabras de 4 bytes, funciona de la misma manera:

00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111    | +1
00000000 00000000 00000000 00000001 00000000 00000000 00000000 00000000

Sin embargo, convertir dichos números al sistema decimal es complicado. (pero funciona bastante bien con hexadecimal )

gronostaj
fuente
21
Su respuesta se lee con condescendencia. OP es hablar con claridad sobre el número, no el texto: large as the number 1 trillion (1000000000000). Además, casi estás hablando de aritmética de precisión arbitraria , pero nunca mencionas ninguno de los términos de lo que estás diciendo ...
MirroredFate
12
"1 billón" también es una cadena
Elzo Valugi
3
@ElzoValugi lo es. Tenía que encontrar alguna forma de presentar el concepto de número abstracto, en lugar de una cadena que representa un número. Creo que "1 billón" es una forma mejor y menos ambigua de hacerlo (ver la prueba en respuesta).
gronostaj
25
@MirroredFate No estoy de acuerdo con 'está hablando claramente del número'. OP dice 'se muestra bien', que claramente me está hablando del texto '1000000000000' ...
Joe
44
@yannbane 'A' es un personaje y no un número. '?' es un personaje y no un número. '1' es un carácter y no un número también. Los personajes son solo símbolos. Pueden representar dígitos o números, pero definitivamente no son números. '1' puede representar uno, diez, cien, mil, etc., es solo un símbolo que representa un dígito que puede ser un número o su parte. '10' (cadena de caracteres) puede significar dos, ocho, diez o dieciséis, etc., pero cuando dices que tienes diez manzanas, estás usando un número diez y todo el mundo sabe a qué te refieres. Hay una gran diferencia entre personajes y números.
gronostaj
40

También puede escribir "ESTA DECLARACIÓN ES FALSA" sin que su computadora se caiga :) La respuesta de Scott es acertada para ciertos marcos de cálculo, pero su pregunta de "escribir" un gran número implica que es solo texto sin formato, al menos hasta Es interpretado.

Editar: ahora con menos sarcasmo, más información útil sobre las diferentes formas en que se puede almacenar un número en la memoria. Los describiré con mayor abstracción, es decir, en términos de que un programador moderno puede escribir código antes de traducirlo al código de máquina para su ejecución.

Los datos en una computadora tienen que estar restringidos a un cierto tipo , y una definición de computadora de ese tipo describe qué operaciones se pueden realizar con estos datos y cómo (es decir, comparar números, concatenar texto o XOR un booleano). No puede simplemente agregar texto a un número, al igual que no puede multiplicar un número por texto, por lo que algunos de estos valores se pueden convertir entre tipos.

Comencemos con enteros sin signo . En estos tipos de valores, todos los bits se utilizan para almacenar información sobre dígitos; el suyo es un ejemplo de un entero sin signo de 32 bits donde se puede almacenar cualquier valor de 0a 2^32-1. Y sí, dependiendo del idioma o la arquitectura de la plataforma utilizada, podría tener enteros de 16 bits o enteros de 256 bits.

¿Qué pasa si quieres ponerte negativo? Intuitivamente, enteros con signo es el nombre del juego. La convención es asignar todos los valores de -2^(n-1)a 2^(n-1)-1- de esta manera evitamos la confusión de tener que lidiar con dos formas de escribir +0y -0. Por lo tanto, un entero de 32 bits con signo tendría un valor de -2147483648a 2147483647. Aseado, ¿no es así?

Ok, hemos cubierto enteros que son números sin un componente decimal. Que expresan estos es más difícil: la parte no entero puede ser sensible solamente en algún lugar entre 0y 1, por lo que cada bit adicional utilizado para describir que aumentaría su precisión: 1/2, 1/4, 1/8 ... El problema es, que ¡no puede expresar con precisión un decimal simple 0.1como una suma de fracciones que solo pueden tener potencias de dos en su denominador! ¿No sería mucho más fácil almacenar el número como un número entero, pero acepta poner el punto radix (decimal) en su lugar? Esto se llama números de punto fijo , donde almacenamos 1234100pero acordamos una convención para leerlo como en su 1234.100lugar.

Un tipo relativamente más común utilizado para los cálculos es floating point. La forma en que funciona es realmente ordenada, usa un bit para almacenar el valor del signo, luego algunos para almacenar exponente y significado. Hay estándares que definen tales asignaciones, pero para un flotante de 32 bits, el número máximo que podría almacenar es abrumador

(2 - 2^-23) * 2^(2^7 - 1) ≈ 3.4 * 10^38

Sin embargo, esto tiene un costo de precisión. JavaScript disponible en los navegadores utiliza flotantes de 64 bits, y todavía no puede hacer las cosas bien. Simplemente copie esto en la barra de direcciones y presione Entrar. Alerta de spoiler: el resultado no será 0.3.

javascript:alert(0.1+0.2);

Hay más tipos alternativos como Microsoft .NET 4.5 BigInteger, que en teoría no tiene límites superiores o inferiores y debe calcularse en "lotes"; pero quizás las tecnologías más fascinantes son aquellas que entienden las matemáticas, como el motor Wolfram Mathematica, que puede trabajar con precisión con valores abstractos como el infinito .

ov
fuente
8
Puedes hacer eso en esta realidad. Intenta hacerlo en el universo de Star Trek. Solo retroceda antes, debido a todas las chispas y humo.
Michael Petrotta
Así no es exactamente cómo funciona el punto fijo. En realidad, es un sistema donde los números se escalan y se sesgan para producir el punto decimal. En su ejemplo, la escala es 1/1000, pero también hay números de punto fijo (especialmente en gráficos de computadora) como este: 0 = 0.0, 255 = 1.0 - la escala es 1/255.
Andon M. Coleman
31

La clave es entender cómo las computadoras codifican los números.

Es cierto que si una computadora insiste en almacenar números usando una representación binaria simple del número usando una sola palabra (4 bytes en un sistema de 32 bits), entonces una computadora de 32 bits solo puede almacenar números de hasta 2 ^ 32. Pero hay muchas otras formas de codificar números dependiendo de lo que quieras lograr con ellos.

Un ejemplo es cómo las computadoras almacenan números de punto flotante. Las computadoras pueden usar diferentes formas de codificarlas. El estándar IEEE 754 define reglas para codificar números mayores que 2 ^ 32. Crudamente, las computadoras pueden implementar esto dividiendo los 32 bits en diferentes partes que representan algunos dígitos del número y otros bits que representan el tamaño del número (es decir, el exponente, 10 ^ x). Esto permite un rango mucho mayorde números en términos de tamaño, pero compromete la precisión (lo cual está bien para muchos propósitos). Por supuesto, la computadora también puede usar más de una palabra para esta codificación aumentando la precisión de la magnitud de los números codificados disponibles. La versión simple decimal 32 del estándar IEEE permite números con aproximadamente 7 dígitos decimales de precisión y números de hasta aproximadamente 10 ^ 96 en magnitud.

Pero hay muchas otras opciones si necesita la precisión adicional. Obviamente, puede usar más palabras en su codificación sin límite (aunque con una penalización de rendimiento para convertir dentro y fuera del formato codificado). Si desea explorar una forma de hacerlo, existe un excelente complemento de código abierto para Excel que utiliza un esquema de codificación que permite cientos de dígitos de precisión en el cálculo. El complemento se llama Xnumbers y está disponible aquí . El código está en Visual Basic, que no es el más rápido posible pero tiene la ventaja de que es fácil de entender y modificar. Es una excelente manera de aprender cómo las computadoras logran la codificación de números más largos. Y puede jugar con los resultados dentro de Excel sin tener que instalar ninguna herramienta de programación.

negro mate
fuente
24

Todo está en tu pregunta.

Puede escribir cualquier número que desee en papel. Intenta escribir un billón de puntos en una hoja de papel blanco. Es lento e ineficaz. Es por eso que tenemos un sistema de 10 dígitos para representar esos números grandes. Incluso tenemos nombres para grandes números como "millones", "billones" y más, por lo que no lo dice one one one one one one one one one one one...en voz alta.

Los procesadores de 32 bits están diseñados para funcionar de manera más rápida y eficiente con bloques de memoria que tienen exactamente 32 dígitos binarios de largo. Pero nosotros, las personas, comúnmente usamos un sistema numérico de 10 dígitos, y las computadoras, siendo electrónicas, usamos un sistema de 2 dígitos ( binario ). Los números 32 y 64 resultan ser potencias de 2. Así que son un millón y un billón son potencias de 10. Es más fácil para nosotros operar con estos números que multitudes de 65536, por ejemplo.

Dividimos los números grandes en dígitos cuando los escribimos en papel. Las computadoras dividen los números en una mayor cantidad de dígitos. Podemos anotar cualquier número que queramos, y también las computadoras si los diseñamos así.

usuario1306322
fuente
15

32 bits y 64 bits se refieren a direcciones de memoria. La memoria de su computadora es como apartados de correos, cada uno tiene una dirección diferente. La CPU (Unidad de procesamiento central) utiliza esas direcciones para direccionar ubicaciones de memoria en su RAM (Memoria de acceso aleatorio). Cuando la CPU solo podía manejar direcciones de 16 bits, solo podía usar 32 MB de RAM (que parecía enorme en ese momento). Con 32 bits fue a 4 + gb (que parecía enorme en ese momento). Ahora que tenemos direcciones de 64 bits, la RAM entra en terabytes (lo que parece enorme).
Sin embargo, el programa puede asignar múltiples bloques de memoria para cosas como almacenar números y texto, eso depende del programa y no está relacionado con el tamaño de cada dirección. Para que un programa pueda decirle a la CPU, voy a usar 10 bloques de direcciones de almacenamiento y luego almacenaré un número muy grande, o una cadena de 10 letras o lo que sea.
Nota al margen: las direcciones de memoria se señalan mediante "punteros", por lo que el valor de 32 y 64 bits significa el tamaño del puntero utilizado para acceder a la memoria.

Ingeniero
fuente
2
Buena respuesta a excepción de los detalles: 16 bits de espacio de direcciones le dieron 64 kb, no 32 mb, y máquinas como la 286 tenían direcciones de 24 bits (para 16 mb). Además, con las direcciones de 64 bits, vas mucho más allá de los terabytes, más como 16 exabytes, los terabytes están alrededor del tipo de límites que imponen las placas base / CPU de la generación actual, no el tamaño de las direcciones.
Phil
44
32 bits se refiere al tamaño de palabra de la máquina, no a las direcciones de memoria. Como Phil mencionó, 286 era una CPU de 16 bits pero usaba 24 bits para direccionar a través de la segmentación de memoria. Las CPU x86 son de 32 bits, pero usan direccionamiento de 36 bits. Ver PAE .
gronostaj
@gronostaj well x86 tienen direccionamiento de 32 bits desde 386 a Pentium.
Ruslan
Vota a favor porque esta es la única respuesta CORRECTA aquí: 32 bits se refiere al direccionamiento de memoria de 32 bits, no a la aritmética de 32 bits.
user1207217
@ user1207217: ?? Entonces, de acuerdo con su razonamiento, por ejemplo, Z80 u 8080 son procesadores de 16 bits (debido al direccionamiento de memoria de 16 bits y al bus de memoria).
Pabouk
13

Porque la visualización del número se realiza utilizando caracteres individuales, no enteros. Cada dígito en el número se representa con un literal de caracteres separado, cuyo valor entero se define por la codificación que se utiliza, por ejemplo, 'a'se representa con un valor ascii 97, mientras que '1'se representa con 49. Consulta la tabla ascii aquí .
Para mostrar tanto 'a' como '1' es lo mismo. Son literales de caracteres, no enteros. Se permite que cada literal de caracteres tenga un valor máximo de 255 en una plataforma de 32 bits que almacena el valor en tamaño de 8 bits o 1 byte (eso depende de la plataforma, sin embargo, 8 bits es el tamaño de caracteres más común), por lo tanto, se pueden agrupar y pueden ser desplegado. La cantidad de caracteres separados que pueden mostrar depende de la RAM que tenga. Si tiene solo 1 byte de RAM, puede mostrar solo un carácter, si tiene 1 GB de RAM, puede mostrar bien 1024 * 1024 * 1024 caracteres (Demasiado perezoso para hacer los cálculos).

Sin embargo, esta limitación se aplica a los cálculos, sin embargo, supongo que le interesa el estándar IPV4. Aunque no está completamente relacionado con las computadorasbit-size, de alguna manera ha afectado los estándares. Cuando se creó el estándar IPV4, almacenaron los valores de ip en enteros de 32 bits. Ahora, una vez que le dio el tamaño, y se convirtió en estándar. Todo lo que sabemos sobre Internet dependía de eso, y luego nos quedamos sin direcciones IP para asignar. Entonces, si se revisó el estándar IP para que tenga 64 bits, todo dejará de funcionar, incluido su enrutador (supongo que esto es correcto) y otros dispositivos de red. Por lo tanto, se debe crear un nuevo estándar, que simplemente cambió el entero de 32 bits por uno de 128 bits. Y ajustado resto del estándar. El fabricante de hardware solo necesita declarar que admite este nuevo estándar y se volverá viral. Aunque no es tan simple, pero supongo que tienes el punto aquí.

Descargo de responsabilidad: la mayoría de los puntos mencionados aquí son fieles a mi suposición. Es posible que haya perdido puntos importantes aquí para simplificarlo. No soy bueno con los números, por lo que debe haber perdido algunos dígitos, pero mi punto aquí es responder la respuesta del OP sobre por qué no bloqueará la PC.

novato
fuente
2
No he votado negativamente, pero hay una serie de problemas con su respuesta. 1es 0x31 en ASCII, no 0x1. 1 GB = 1024 ^ 3 B. El dispositivo IPv4 inventado antes de que se introdujeran las CPU de 32 bits, por lo que decir que las direcciones se almacenaban en enteros de 32 bits está en conflicto con la pregunta de OP. Y finalmente IPv6 está usando direcciones de 128 bits, no de 64 bits.
gronostaj
13

En los procesadores, hay "palabras". Hay diferentes palabras Cuando las personas dicen "procesador de 32 bits", se refieren principalmente al "ancho del bus de memoria". Esta palabra consta de diferentes "campos", que se refieren a subsistemas de computadora correspondientes a la transmisión (24 bits) y al control (otros bits). Puedo estar equivocado acerca de los números exactos, asegúrese de hacerlo a través de los manuales.

Un aspecto completamente diferente es el cálculo. Los conjuntos de instrucciones SSE y MMX pueden almacenar enteros largos. La longitud máxima sin pérdida de productividad depende de la versión SSE actual, pero siempre se trata de múltiples de 64 bits.

Los procesadores Opteron actuales pueden manejar números de 256 bits de ancho (no estoy seguro acerca del entero, pero el flotante es seguro).

Resumen : (1) el ancho del bus no está conectado al ancho de cálculo directamente, (2) incluso palabras diferentes (palabra de memoria, palabra de registro, palabra de bus, etc.) no están conectadas entre sí, de lo contrario tienen un divisor común de aproximadamente 8 o 16 o 24. Muchos procesadores incluso usaron palabras de 6 bits (pero su historial).

sanaris
fuente
No es cierto, el procesador Pentium original tenía un bus de datos de 64 bits para un ancho de banda de memoria alto, aunque era un procesador de 32 bits. El 8088 era un procesador de 16 bits con un bus de datos de 8 bits.
doug65536
10

El propósito de un dispositivo informático, en general, es aceptar, procesar, almacenar y emitir datos. El hardware subyacente es simplemente una máquina que ayuda a realizar esas cuatro funciones. No puede hacer nada de eso sin software.

El software es el código que le dice a la máquina cómo aceptar datos, cómo procesarlos, cómo almacenarlos y cómo proporcionarlos a otros.

El hardware subyacente siempre tendrá limitaciones. En el caso de una máquina de 32 bits, la mayoría de los registros que procesan datos tienen solo 32 bits de ancho. Sin embargo, esto no significa que la máquina no pueda manejar números más allá de 2 ^ 32, significa que si desea manejar números más grandes, la máquina puede tardar más de un ciclo en aceptarlo, procesarlo y almacenarlo. o lo emite.

El software le dice a la máquina cómo manejar los números. Si el software está diseñado para manejar números grandes, envía una serie de instrucciones a la CPU que le indican cómo manejar los números más grandes. Por ejemplo, su número puede ser representado por dos registros de 32 bits. Si desea agregar 1,234 a su número, el software le dirá a la CPU que primero agregue 1,234 al registro inferior, luego verifique el bit de desbordamiento para ver si esa adición resultó en un número demasiado grande para el registro inferior. Si lo hizo, entonces agrega 1 al registro superior.

De la misma manera que se les enseña a los niños de primaria a sumar con carry, se le puede decir a la CPU que maneje números más grandes de lo que puede contener en un solo registro. Esto es cierto para la mayoría de las operaciones matemáticas genéricas, para números de cualquier tamaño práctico.

Adam Davis
fuente
10

La diferencia radica en cómo almacenamos los datos en las computadoras.

Tiene razón en que para una máquina teórica de 8 bits, solo podemos almacenar 2 ^ 8 valores en un solo registro de procesador o dirección de memoria. (Tenga en cuenta que esto varía de "máquina" a "máquina" según el procesador utilizado, la arquitectura de la memoria, etc. Pero por ahora, sigamos con una hipotética máquina de 'estereotipo').

Para una máquina teórica de 16 bits, el valor máximo en una ubicación de registro / memoria sería 2 ^ 16, para una máquina de 32 bits, 2 ^ 32, etc.

Con los años, los programadores han ideado todo tipo de artimañas para almacenar y manejar números mayores que los que se pueden almacenar en un solo registro de procesador o dirección de memoria. Existen muchos métodos, pero todos implican usar más de una dirección de registro / memoria para almacenar valores mayores que su ancho de ubicación de registro / memoria "nativo".

Todos estos métodos son beneficiosos porque la máquina puede almacenar / procesar valores mayores que su capacidad nativa. La desventaja es que casi todos los enfoques requieren múltiples instrucciones de máquina / lecturas / etc. para manejar estos números. Para el gran número ocasional, esto no es un problema. Cuando se trata con muchos números grandes (direcciones de memoria grandes en particular), la sobrecarga involucrada ralentiza las cosas.

De ahí el deseo general de hacer que los registros, las ubicaciones de memoria y el hardware de dirección de memoria sean "cada vez más amplios" para manejar grandes números "de forma nativa", de modo que dichos números puedan manejarse con el mínimo número de operaciones.

Dado que el tamaño del número es infinito, el registro del procesador / tamaño de la memoria / direccionamiento es siempre un equilibrio del tamaño del número nativo y los costos involucrados en la implementación de anchos cada vez más grandes.

usuario48420
fuente
8

Las computadoras de 32 bits solo pueden almacenar números de hasta 2 ^ 32 en una sola palabra de máquina, pero eso no significa que no puedan manejar entidades de datos más grandes.

El significado de una computadora de 32 bits es generalmente que el bus de datos y el bus de direcciones tienen 32 bits de ancho, lo que significa que la computadora puede manejar 4 GB de espacio de direcciones de memoria a la vez y enviar cuatro bytes de datos a la vez a través del bus de datos .

Sin embargo, eso no limita que la computadora maneje más datos, solo tiene que dividir los datos en cuatro fragmentos de bytes cuando se envían a través del bus de datos.

El procesador Intel de 32 bits normal puede manejar números de 128 bits internamente, lo que le permitiría manejar números como 100000000000000000000000000000000000000 sin ningún problema.

Puede manejar números mucho más grandes que eso en una computadora, pero luego los cálculos deben hacerse por software, la CPU no tiene instrucciones para manejar números mayores de 128 bits. (Puede manejar números mucho más grandes en forma de números de coma flotante, pero solo tiene 15 dígitos de precisión).

Guffa
fuente
6

Simplemente agregue una nota a las muchas otras respuestas, porque este es un hecho bastante importante en esta pregunta que se ha perdido.

"32 bits" se refiere al ancho de la dirección de memoria. No tiene nada que ver con el tamaño del registro. Es probable que muchas CPU de 32 bits tengan registros de 64 o incluso 128 bits. En particular, en referencia a la línea de productos x86, las CPU de consumo recientes, que son todas de 64 bits, poseen registros de hasta 256 bits para fines especiales.

Esta diferencia entre el ancho del registro y el ancho de la dirección ha existido desde la antigüedad, cuando teníamos registros de 4 bits y direcciones de 8 bits, o viceversa.

Es simple ver que almacenar un gran número no es un problema, independientemente del tamaño del registro, como se explica en otras respuestas.

La razón por la cual los registros, de cualquier tamaño que puedan ser, también se pueden calcular con números más grandes, es que los cálculos demasiado grandes se pueden dividir en varios más pequeños que encajan en los registros (es un poco más complicado en realidad).

mafu
fuente
Eso no es realmente cierto; a lo que se refiere 64 bits es inconsistente, pero los sistemas con anchos de registro de 64 bits con frecuencia se denominan 64 bits. Wikipedia dice que "una arquitectura de computadora de 64 bits generalmente tiene registros enteros y de direccionamiento que tienen 64 bits de ancho". Sí, la moderna línea de productos x86 (o AMD-64) tiene enormes registros de propósito especial, pero tienen registros principales de 64 bits y pueden acceder a 48-52 bits de memoria; Los sistemas x86 más antiguos tienen registros principales de 32 bits y tienen acceso a 24-36 bits de memoria, y el 8086 se denominó chip de 16 bits, tenía registros de 16 bits de ancho y tenía acceso a 20 bits de memoria.
prosfilaes
@prosfilaes Esa es una gran cantidad de información valiosa, me refería a ellos (no pude recordar los detalles tan bien como tú). Siéntase libre de editar esto en la respuesta.
mafu
6

Las respuestas ya dadas son bastante buenas, pero tienden a abordar el problema desde diferentes lados y, por lo tanto, presentan una imagen incompleta. También son un poco demasiado técnicos, en mi opinión.

Entonces, solo para aclarar algo que se insinúa pero que no se expresa explícitamente en ninguna de las otras respuestas, y que creo que es el quid de la cuestión:

Está mezclando varios conceptos en su pregunta , y uno de ellos ("32 bits") en realidad puede referirse a una variedad de cosas diferentes (y diferentes respuestas han asumido diferentes interpretaciones). Todos estos conceptos tienen algo que ver con la cantidad de bits (1 y 0) utilizados (o disponibles) en varios contextos informáticos (lo que quiero decir con esto se aclarará con los ejemplos a continuación), pero los conceptos no están relacionados .

Explícitamente:

  • "IPv4 / 6" se refiere al protocolo de Internet , un conjunto de reglas que definen cómo se debe empaquetar e interpretar la información en Internet. La distinción principal (o al menos la más conocida) entre IPv4 e IPv6 es que el espacio de direcciones (es decir, el conjunto de direcciones que se pueden usar para distinguir entre diferentes ubicaciones en la red) es mayor en IPv6. Esto tiene que ver con cuántos bits en cada paquete de datos enviados a través de la red se asignan (es decir, se reservan para el propósito de) identificar el remitente y el destinatario del paquete.
    • Analogía no computacional: cada paquete es como una carta enviada por correo postal, y el espacio de direcciones es como la cantidad de caracteres que se le "permite" usar al escribir la dirección y la dirección de retorno en el sobre.
    • No veo esto mencionado en ninguna de las otras respuestas hasta ahora.
  • Las "palabras" de la memoria de la computadora (32 bits y 64 bits) generalmente pueden considerarse como el dato más pequeño que una computadora usa, o "piensa". Estos bits de datos se unen para formar otros bits de datos. , como fragmentos de texto o enteros más grandes.
  • Los punteros de 32 bits pueden o no ser palabras, pero de todos modos se tratan atómicamente (es decir, como unidades individuales que no se pueden dividir en componentes más pequeños). Los punteros son la forma de nivel más bajo en la que una computadora puede registrar la ubicación en la memoria de una porción arbitraria de datos. Tenga en cuenta que el tamaño del puntero utilizado por la computadora (o, realmente, por el sistema operativo) limita el rango de memoria al que puede acceder un solo puntero, ya que solo hay tantas ubicaciones de memoria posibles a las que un puntero puede "apuntar" ya que hay valores posibles para el puntero en sí. Esto es análogo a la forma en que IPv4 limita el rango de posibles direcciones de Internet, pero nolimite la cantidad de datos que pueden estar presentes en, por ejemplo, una página web en particular. Sin embargo, el tamaño del puntero no limita el tamaño de los datos en sí mismos al que puede apuntar el puntero. (Para ver un ejemplo de un esquema para permitir que el tamaño de los datos exceda el rango del puntero, consulte la estructura del puntero de inodo de Linux . Tenga en cuenta que este es un uso ligeramente diferente de la palabra "puntero" que es típico, ya que el puntero generalmente se refiere a un puntero en memoria de acceso aleatorio, no espacio en el disco duro).
    • Analogía no computacional: hmmmm ... esto es un poco complicado. ¿Quizás el sistema decimal de Dewey para indexar materiales de biblioteca es un poco similar? O cualquier sistema de indexación, de verdad.
    • Ver la respuesta de SiteNook .
    • Tenga en cuenta que mi explicación de los punteros anteriores elimina algunos detalles sutiles y podría decirse que no es del todo correcta. Sin embargo, en los lenguajes de programación en los que los programadores trabajan directamente con punteros, el modo mental que he dibujado suele ser suficiente para fines prácticos.
  • Los números que una computadora es "capaz de mostrar" no están (para fines prácticos) limitados por el hardware o el sistema operativo de la computadora; son tratados como cualquier otro texto.

Tenga en cuenta que esto no pretende ser una lista exhaustiva de interpretaciones para la frase "32 bits".

Crédito adicional: para ver realmente la distinción filosófica básica entre números y fragmentos primitivos de memoria de la computadora, lea un poco sobre las máquinas de Turing .

Kyle Strand
fuente
Creo que la referencia a IPv4 fue señalar que el número de direcciones IPv4 está efectivamente limitado a la longitud de un entero de 32 bits con signo, mientras que IPv6 usa 128 bits y, por lo tanto, puede tener muchos más órdenes de magnitud.
Clonkex
@Clonkex Posiblemente, aunque definitivamente esa no es la pregunta formulada.
Kyle Strand
5

Si escribe 1000000000000, por ejemplo, en la calculadora, la computadora lo calculará como un número de tipo real con punto decimal . El límite de 32 bits que mencionó toca más todos los números de tipo Entero sin punto decimal. Los diferentes tipos de datos utilizan diferentes métodos para ingresar bits / bytes.

Números de tipo entero : esta tabla podría ayudarlo a captar el punto ( http://msdn.microsoft.com/en-us/library/296az74e.aspx ). Esto toca los límites de C ++. Por ejemplo, el número de tipo Int64 tiene límites desde -9223372036854775808 hasta 9223372036854775807.

Números de tipo real : los números de tipo real contienen valores con coma flotante y exponente y puede ingresar números mucho más grandes, pero con precisión / precisión limitadas. ( http://msdn.microsoft.com/en-us/library/6bs3y5ya.aspx ) Por ejemplo, LDBL (doble grande) en C ++ tiene el exponente máximo 308, por lo que posiblemente pueda ingresar o tener como resultado un número 9.999 x 10^308, lo que significa que Teóricamente tienen 308 (+1) dígitos de 9pero solo se usarán 15 dígitos más importantes para representarlo, el resto se perderá, debido a la precisión limitada.

Además, hay diferentes lenguajes de programación y podrían tener diferentes implementaciones de límites de número. Por lo tanto, puede imaginar que las aplicaciones especializadas podrían manejar números mucho más grandes (y / o más exactos / precisos) que C ++.

Dee
fuente
Esta "respuesta" es incorrecta: las calculadoras usan la representación del número BCD para evitar errores de truncamiento. IE 0.1 decimal no se puede representar con precisión como un número binario de longitud finita.
aserrín
5

En caso de que desee un ejemplo práctico de cuántos programas en un sistema Linux típico manejan gran cantidad de procesamiento y salida:

libgmp- La biblioteca aritmética de precisión múltiple GNU es la biblioteca más utilizada para este propósito en sistemas Linux. Un ejemplo simple de multiplicar 2 ^ 80 por 1000:

#include <gmp.h>

// Each large integer uses the mpz_t type provided by libgmp
mpz_t a_large_number;
mpz_t base;
mpz_t result;

// Initalize each variable
mpz_init(a_large_number);
mpz_init(base);
mpz_init(result);

// Assign the number 2 to the variable |base|
mpz_set_ui(base, 2);

// Raise base^80 (2^80), store the result in |a_large_number|
mpz_pow_ui(a_large_number, base, 80);

// Multiply |a_large_number| by 1000, store the result in |result|
mpz_mul_ui(result, a_large_number, 1000);

// Finally, output the result in decimal and hex notation
gmp_printf("decimal: %Zd, hex: %ZX\n", result, result);

Básicamente, es lo mismo que usar los operadores normales + - * /, solo con una biblioteca para dividir los números y almacenarlos internamente como números de máquinas múltiples (es decir, de 32 bits). También hay funciones de tipo scanf () para manejar la conversión de entrada de texto a tipos enteros.

La estructura de mpz_tes exactamente como el ejemplo de Scott Chamberlain de contar hasta 6 con dos manos. Básicamente es una matriz de mp_limb_ttipos de tamaño de palabra de máquina , y cuando un número es demasiado grande para caber en una palabra de máquina, GMP usa múltiples mp_limb_tpara almacenar las partes altas / bajas del número.

Animismo
fuente
5

En tu mente solo conoces 10 dígitos diferentes. 0 a 9. Internamente en su cerebro, esto ciertamente está codificado de manera diferente que en una computadora.

Una computadora usa bits para codificar números, pero eso no es importante. Esa es la forma en que los ingenieros eligieron codificar cosas, pero debes ignorar eso. Puedes pensar que una computadora de 32 bits tiene una representación única de más de 4 mil millones de valores diferentes, mientras que nosotros los humanos tenemos una representación única de 10 valores diferentes.

Siempre que debemos comprender un número mayor, utilizamos un sistema. El número de la izquierda es el más importante. Es 10 veces más importante que el siguiente.

Una computadora capaz de diferenciar entre cuatro mil millones de valores diferentes, de manera similar, tendrá que hacer que el valor más a la izquierda, en un conjunto de valores, sea cuatro mil millones de veces más importante que el siguiente valor en ese conjunto. En realidad, a una computadora no le importa en absoluto. No asigna "importancia" a los números. Los programadores deben hacer un código especial para encargarse de eso.

Siempre que un valor se vuelve mayor que el número de símbolos únicos, 9 en la mente de los humanos, agregas uno al número a la izquierda.

3+3=6

En este caso, el número todavía cabe dentro de un solo "espacio"

5+5=10. This situation is called an overflow.

Entonces los humanos siempre lidian con el problema de no tener suficientes símbolos únicos. A menos que la computadora tenga un sistema para lidiar con esto, simplemente escribiría 0, olvidando que había un número extra. Afortunadamente, las computadoras tienen una "bandera de desbordamiento" que se levanta en este caso.

987+321 is more difficult.

Es posible que hayas aprendido un método en la escuela. Un algoritmo El algoritmo es bastante simple. Comience agregando los dos símbolos más a la izquierda.

7+1=8, we now have ...8 as the result so far

Luego, pasa al siguiente espacio y realiza la misma adición.

8+2=10, the overflow flag is raised. We now have ...08, plus overflow.

Como tuvimos un desbordamiento, significa que tenemos que agregar 1 al siguiente número.

9+3=12, and then we add one due to overflow. ...308, and we had another overflow.

No hay más números para agregar, por lo que simplemente creamos un espacio e inserto 1 porque se levantó la bandera de desbordamiento.

1308

Una computadora lo hace exactamente de la misma manera, excepto que tiene 2 ^ 32 o incluso mejores 2 ^ 64 símbolos diferentes, en lugar de solo 10 como los humanos.

A nivel de hardware, la computadora funciona en bits individuales utilizando exactamente el mismo método. Afortunadamente, eso se abstrae para los programadores. Los bits son solo dos dígitos, porque eso es fácil de representar en una línea eléctrica. O la luz está encendida o está apagada.

Finalmente, una computadora podría mostrar cualquier número como una secuencia simple de caracteres. Para eso son las mejores computadoras. El algoritmo para convertir entre una secuencia de caracteres y una representación interna es bastante complejo.

frodeborli
fuente
En mi opinión, sé 36, pero normalmente solo uso 16 de ellos.
Kyle Strand
"Una computadora usa bits para codificar números, pero eso no es importante". En el contexto del usuario, es muy importante preguntar acerca de las palabras de 32 bits y cómo se usan para almacenar números mayores que 2 ^ 32-1.
HörmannHH
No es importante cómo codifica los números en la memoria de su cerebro. Tienes un número finito de representaciones; La mayoría ha aprendido 10 símbolos diferentes. Dentro de su cerebro, esto probablemente se representa en forma de miles de neuronas y sinapsis. En una computadora se representa en forma de electricidad o no hay electricidad en una línea eléctrica. Desde una perspectiva de programación, o cuando se aprenden matemáticas, no es importante en absoluto, excepto en el raro caso de que esté programando directamente para un conjunto específico de CPU. Pregunta acerca de 32 bits frente a 64 bits, no bits individuales.
frodeborli
3

Porque no está mostrando un número (en lo que respecta a la computadora), sino una cadena o una secuencia de dígitos. Claro, algunas aplicaciones (como la calculadora, supongo), que tratan con números, pueden manejar ese número, supongo. No sé qué trucos usan ... Estoy seguro de que algunas de las otras respuestas más elaboradas cubren eso.

Rolf
fuente
0

La mayor parte del contenido de esta respuesta vino originalmente de esta respuesta (escrita antes de que esa otra pregunta se marcara como duplicada). Así que discuto el uso de valores de 8 bits (aunque esta pregunta se refería a valores de 32 bits), pero está bien porque los valores de 8 bits son más simples de entender conceptualmente, y los mismos conceptos se aplican a valores más grandes como la aritmética de 32 bits.

Cuando agrega dos números de 8 bits, el número más grande que puede obtener (0xFF + 0xFF = 1FE). De hecho, si multiplica dos números que son de 8 bits, el número más grande que puede obtener (0xFF * 0xFF = 0xFE01) sigue siendo 16 bits, dos veces de 8 bits.

Ahora, puede suponer que un procesador de x bits solo puede realizar un seguimiento de los bits de x. (Por ejemplo, un procesador de 8 bits solo puede realizar un seguimiento de 8 bits). Eso no es exacto. El procesador de 8 bits recibe datos en fragmentos de 8 bits. (Estos "fragmentos" generalmente tienen un término formal: una "palabra". En un procesador de 8 bits, se usan palabras de 8 bits. En un procesador de 64 bits, se pueden usar palabras de 64 bits).

Entonces, cuando le da a la computadora 3 bytes:
Byte n. ° 1: la instrucción MUL
Byte n. ° 2: los bytes de orden superior (por ejemplo, 0xA5)
Byte n. ° 3: los bytes de orden inferior (por ejemplo, 0xCB)
La computadora puede generar un resultado que Es más de 8 bits. La CPU puede generar resultados como este:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Ahora, permíteme interpretar eso para ti:
0x solo significa que los siguientes dígitos son hexadecimales.
Discutiré los "40" con más detalle momentáneamente.
82 es parte del registro "A", que es una serie de 8 bits.
xx y xx son parte de otros dos registros, denominados el registro "B" y el registro "C". La razón por la que no llené esos bits con ceros o unos es que una instrucción "ADD" (enviada a la CPU) puede hacer que esos bits no cambien por la instrucción (mientras que la mayoría de los otros bits que uso en este ejemplo pueden se alteran, excepto algunos de los bits de la bandera).
D7 cabría en más bits, llamado el registro "D".
Un registro es solo una pieza de memoria. Los registros están integrados en las CPU, por lo que la CPU puede acceder a los registros sin necesidad de interactuar con la memoria en una memoria RAM.

Entonces el resultado matemático de 0xA5 por 0xCB es 0x82D7.

Ahora, ¿por qué los bits se dividieron en los registros A y D en lugar de los registros A y B, o los registros C y D? Bueno, una vez más, este es un escenario de muestra que estoy usando, destinado a ser bastante similar en concepto a un lenguaje ensamblador real (Intel x86 de 16 bits, como lo usan Intel 8080 y 8088 y muchas CPU más nuevas). Puede haber algunas reglas comunes, como el registro "C" que generalmente se usa como índice para operaciones de conteo (típico para bucles), y el registro "B" que se usa para realizar un seguimiento de las compensaciones que ayudan a especificar ubicaciones de memoria. Entonces, "A" y "D" pueden ser más comunes para algunas de las funciones aritméticas comunes.

Cada instrucción de CPU debe tener alguna documentación, utilizada por personas que programan en ensamblador. Esa documentación debe especificar qué registros son utilizados por cada instrucción. (Por lo tanto, la elección sobre qué registros usar a menudo la especifican los diseñadores de la CPU, no los programadores de lenguaje ensamblador. Sin embargo, puede haber cierta flexibilidad).

Ahora, volviendo al "40" en el ejemplo anterior: es una serie de bits, a menudo llamado "registro de banderas". Cada bit en el registro de banderas tiene un nombre. Por ejemplo, hay un bit de "desbordamiento" que la CPU puede establecer si el resultado es mayor que el espacio que puede almacenar un byte de los resultados. (El bit de "desbordamiento" a menudo se puede denominar con el nombre abreviado de "OF". Eso es una o mayúscula, no un cero). El software puede verificar el valor de esta bandera y notar el "problema". El trabajo con este bit a menudo se maneja de forma invisible por los lenguajes de nivel superior, por lo que los programadores principiantes a menudo no aprenden cómo interactuar con los indicadores de la CPU. Sin embargo, los programadores de ensamblados pueden acceder comúnmente a algunos de estos indicadores de una manera muy similar a otras variables.

Por ejemplo, puede tener múltiples instrucciones ADD. Una instrucción ADD podría almacenar 16 bits de resultados en el registro A y el registro D, mientras que otra instrucción podría almacenar los 8 bits bajos en el registro A, ignorar el registro D y especificar el bit de desbordamiento. Luego, más tarde (después de almacenar los resultados del registro A en la RAM principal), podría usar otra instrucción ADD que almacene solo los 8 bits altos en un registro (posiblemente el registro A). Si necesita usar un indicador de desbordamiento dependerá de la instrucción de multiplicación que use.

(También suele haber un indicador de "subdesbordamiento", en caso de que reste demasiado para que quepa en el resultado deseado).

Solo para mostrarle lo complicadas que se pusieron las cosas:
el Intel 4004 era una CPU de 4 bits
El Intel 8008 era una CPU de 8 bits. Tenía registros de 8 bits llamados A, B, C y D.
El Intel 8086 era una CPU de 16 bits. Tenía registros de 16 bits llamados AX, BX, CX y DX.
El Intel 80386 era una CPU de 32 bits. Tenía registros de 32 bits llamados EAX, EBX, ECX y EDX.
Las CPU Intel x64 tienen registros de 64 bits denominados RAX, RBX, RCX y RDX. Los chips x64 pueden ejecutar código de 16 bits (en algunos modos de funcionamiento) y pueden interpretar instrucciones de 16 bits. Al hacerlo, los bits que conforman el registro AX son la mitad de los bits que conforman el registro EAX, que son la mitad de los bits que conforman el registro RAX. Entonces, cada vez que cambie el valor de AX, también está cambiando EAX y RAX, porque esos bits utilizados por AX son parte de los bits utilizados por RAX. (Si cambia EAX por un valor que es un múltiplo de 65,536, entonces los 16 bits bajos no cambian para que AX no cambie. Si cambia EAX por un valor que no es un múltiplo de 65,536, eso también afectaría a AX .)

Hay más banderas y registros que solo los que he mencionado. Simplemente elegí algunos de uso común para proporcionar un ejemplo conceptual simple.

Ahora, si está en una CPU de 8 bits, cuando escribe en la memoria, puede encontrar algunas restricciones sobre la posibilidad de referirse a una dirección de 8 bits, no a una dirección de 4 bits o 16 bits. Los detalles variarán según la CPU, pero si tiene tales restricciones, entonces la CPU puede estar tratando con palabras de 8 bits, por lo que la CPU se conoce comúnmente como una "CPU de 8 bits".

TOOGAM
fuente
Siento que partes de mi respuesta repiten algunas de las otras respuestas a esta pregunta. Sin embargo, esto no se notó cuando escribí el contenido por primera vez desde que lo escribí para otra pregunta. Además, aunque aprecio la respuesta de Animism que incluye algo de código en el lenguaje C, sentí que mi contenido proporcionaba algunos detalles sobre cómo funciona Assembly, que está más cerca de las acciones / diseño reales de la CPU. Entonces, mi respuesta no está tratando de ser la respuesta superior que sea "mejor que" todas las demás, sino simplemente suplementaria; agregando otra perspectiva con una idea adicional
TOOGAM