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?
10^9
sin que mi PC se caiga?" sino más bien "¿Cómo puedo escribir10^(18)
sin que mi cerebro se estrelle?"Respuestas:
Respondo tu pregunta preguntándote una diferente:
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.
fuente
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 binario00110000
), 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
0
sy1
s. 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.
fuente
1000000000000
exactamente. Son 10 ^ 12, o 2 ^ 12 * 5 ^ 12; 5 ^ 12 requiere 28 bits de mantisa.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.
Al presionar 1una vez y luego 012 veces, está escribiendo texto. 1entradas
1
, 0entradas0
. ¿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
0
y1
a binario, cada palabra en una línea separada)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:
0..9
Aquí hay una memoria vacía de 2 palabras:
Guardemos el número 4:
Ahora agreguemos 9:
Observe que ambos operandos cabrían en un byte, pero no el resultado. Pero tenemos otro listo para usar. Ahora almacenemos 99:
Nuevamente, hemos usado el segundo byte para almacenar el número. Agreguemos 1:
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:
Y ahora agregue 1:
Se vuelve más claro si elimina espacios de separación de bytes y líneas nuevas:
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:
Sin embargo, convertir dichos números al sistema decimal es complicado. (pero funciona bastante bien con hexadecimal )
fuente
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 ...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
0
a2^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)
a2^(n-1)-1
- de esta manera evitamos la confusión de tener que lidiar con dos formas de escribir+0
y-0
. Por lo tanto, un entero de 32 bits con signo tendría un valor de-2147483648
a2147483647
. 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
0
y1
, 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 simple0.1
como 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 almacenamos1234100
pero acordamos una convención para leerlo como en su1234.100
lugar.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 abrumadorSin 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
.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 .fuente
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.
fuente
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í.
fuente
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.
fuente
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 ascii97
, mientras que'1'
se representa con49
. 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 computadoras
bit-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.
fuente
1
es 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.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).
fuente
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.
fuente
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.
fuente
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).
fuente
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).
fuente
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:
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 .
fuente
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 de9
pero 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 ++.
fuente
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: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_t
es exactamente como el ejemplo de Scott Chamberlain de contar hasta 6 con dos manos. Básicamente es una matriz demp_limb_t
tipos 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últiplesmp_limb_t
para almacenar las partes altas / bajas del número.fuente
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.
En este caso, el número todavía cabe dentro de un solo "espacio"
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.
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.
Luego, pasa al siguiente espacio y realiza la misma adición.
Como tuvimos un desbordamiento, significa que tenemos que agregar 1 al siguiente número.
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.
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.
fuente
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.
fuente
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".
fuente