Comprensión profunda de los sistemas informáticos (2): representación y procesamiento de información

Comprensión profunda de los sistemas informáticos (2): representación y procesamiento de información

¿Cómo se representa la información?

La mayoría de las computadoras usan bloques de 8 bits, o bytes , como la unidad de memoria direccionable más pequeña, en lugar de acceder a bits individuales en la memoria. Los programas a nivel de máquina tratan la memoria como una matriz de bytes muy grande y se convierten en memoria virtual . Cada byte de memoria se identifica por un número único y se convierte en su dirección. La colección de todas las direcciones posibles se denomina espacio de dirección virtual. .

Notación hexadecimal

Sabemos que un byte está compuesto de 8 bits. En notación binaria, el rango es 00000000 ~ 11111111. Convertido a decimal, el rango de valores es 0 ~ 255. Estas dos formas de describir bits no son muy buenas, porque el binario es demasiado largo y la conversión decimal y binaria es muy problemática, por lo que surgió un método de compromiso que utiliza la notación hexadecimal.

La siguiente figura muestra el decimal y el binario correspondientes a la notación hexadecimal.

[La transferencia de la imagen de la cadena externa falló, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-s5lZGU2A-1586855517914) (C: \ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200414155530616.png)]

Los números que comienzan con 0x o 0X son valores hexadecimales. La conversión entre hexadecimal, binario y decimal sigue siendo un conocimiento muy básico, debe dominarlo, ¡y no lo introduciré en detalle aquí!

¿Cuál es el tamaño de datos de la palabra

Cuando descargamos ciertos paquetes de instalación de software, a menudo vemos instrucciones de paquetes de instalación de 32 y 64 bits. ¿Qué significan estos 32 bits y 64 bits? De hecho, se refiere a máquinas de longitud de palabra de 32 bits y máquinas de longitud de palabra de 64 bits.
Inserte la descripción de la imagen aquí
Cada computadora tiene una longitud de palabra, que indica el tamaño estándar de los datos del puntero. La dirección virtual está codificada con dicha palabra, por lo que el parámetro del sistema más importante determinado por la longitud de la palabra es el tamaño máximo del espacio de dirección virtual. Por ejemplo, la longitud de palabra de mi computadora es de 64 bits, luego el rango de la dirección virtual es de 0 ~ 2 a la 64ª potencia -1, y el programa puede acceder a hasta 2 64ª bytes de potencia.

La mayoría de las computadoras de 64 bits pueden ejecutar programas de compilación de máquinas de 32 bits, pero los programas de 64 bits solo pueden ejecutarse en máquinas de 64 bits.

Direccionamiento y orden de bytes

En casi todas las máquinas, los objetos de varios bytes se almacenan como una secuencia continua de bytes, y la dirección del objeto es la dirección más pequeña de los bytes utilizados. Por ejemplo, la dirección de la variable x de tipo int es 0x100, es decir, la expresión de dirección & x en C es 0x100, luego se almacenarán 4 bytes de x en la memoria en 0x100, 0x101, 0x102, 0x103.

¿Cómo exactamente cómo almacenarlo? Hay dos formas, una es big-endian: el byte más significativo es el primero y la otra es little-endian: el byte menos significativo es el primero. Todavía utilizando el ejemplo que se acaba de describir, el valor hexadecimal de x es 0x01234567, y el orden de bytes del rango de direcciones 0x100 ~ 0x103 se organiza de acuerdo con los métodos de endian grande y little endian de la siguiente manera:

[Falló la transferencia de la imagen de la cadena externa, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-1Tc8XUxh-1586855517916) (C: \ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200414161338024.png)]

La elección de big-endian o little-endian depende del tipo de máquina. La mayoría de ellos solo usan el modo little-endian, y algunos microprocesadores nuevos usan el método de doble extremo.

Para nosotros, el orden de bytes utilizado por la máquina no es visible para nosotros, pero el orden de bytes es realmente importante para los usuarios. Por ejemplo, si una máquina big-endian se comunica con una máquina little-endian a través de la red, los bytes de la palabra se revertirán en el programa receptor. Para evitar tales problemas, el destinatario debe hacer algunas conversiones.

Cómo representar cadenas y códigos

La cadena está representada por una codificación estándar, lo común es el código de caracteres ASC II. Se obtendrá el mismo resultado en cualquier sistema que utilice el código ASCⅡ como código de caracteres, independientemente del orden de bytes y las reglas de tamaño de palabra. Los datos de texto tienen una mayor independencia de la plataforma que los datos binarios.

¿Cómo representar el código? En la comprensión profunda del sistema informático (1), presentamos brevemente que los archivos como hello.c están compuestos por caracteres ASCⅡ y pertenecen a archivos de texto. Después de la compilación, se generará el código de máquina expresado en bytes (indicado por código binario). Incluso si el mismo proceso se ejecuta en diferentes sistemas operativos, habrá diferentes reglas de codificación. Como la siguiente función de suma, los resultados de la compilación en diferentes sistemas operativos son diferentes:

int sum(int x,int y){
    return x+y;
}

[Falló la transferencia de la imagen de la cadena externa, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-TsP6WfWM-1586855517921) (C: \ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200414170514072.png)]

Operaciones comunes en lenguaje C

Operaciones booleanas

, &, | Indicar que corresponden, respectivamente, y ^ lógicas NOT, AND, OR, Exclusive- O, regla de cálculo específica no presentó. ** , &, | forman un álgebra booleana **, el álgebra booleana tiene muchas similitudes con operaciones aritméticas de enteros, como operaciones booleanas y pares | y | pares y tienen leyes de distribución, como a & (b | c) = (a & b ) | (A y c), a | (b y c) = (a | b) y (a | c).

Cuando considere ~, &, ^ en el vector de bits, obtendrá una forma matemática diferente, llamada anillo booleano. Hay una propiedad muy importante que puede usarse para resolver problemas en el problema del algoritmo de pincel, (a ^ b) ^ a = b.

Los vectores de bits también se pueden utilizar para representar un conjunto finito, y debido a la operación booleana | y & correspondiente a la unión e intersección del conjunto, ~ correspondiente al complemento del conjunto, por lo que cuando se utilizan vectores de bits para representar el conjunto, es muy conveniente Consolidación de colecciones.

Las operaciones booleanas de C bits se admiten en lenguaje C.

Operación lógica

Los operadores lógicos ||, y &&! , Correspondientes a operaciones OR, AND, NOT en lógica proposicional. Las operaciones lógicas y las operaciones booleanas bit a bit son diferentes:

  • Las operaciones booleanas bit a bit solo tienen el mismo comportamiento que las operaciones lógicas correspondientes cuando el parámetro está limitado a 0 o 1.
  • La segunda diferencia entre && y || y el correspondiente & y | es que si el resultado de la expresión se puede determinar evaluando el primer parámetro, el operador lógico no evaluará el segundo parámetro.
Operación de cambio

La operación de desplazamiento no es más que moverse hacia la izquierda o hacia la derecha, tomando el movimiento hacia la derecha como ejemplo, generalmente hay dos formas de desplazamiento a la derecha: desplazamiento lógico a la derecha y desplazamiento aritmético a la derecha. x>>k:

El desplazamiento lógico a la derecha se llena con k 0s en el extremo izquierdo, y el desplazamiento aritmético a la derecha es llenar el valor de los k bits más significativos en el extremo izquierdo. Los números en cursiva indican los valores desplazados izquierda / derecha.
[Falló la transferencia de la imagen de la cadena externa, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-NgyxCOmr-1586855517924) (C: \ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200414164328504.png)]
C no especifica qué forma de desplazamiento hacia la izquierda y hacia la derecha se requiere para los números con signo, pero casi todas las combinaciones de compilador / máquina utilizan cambios aritméticos hacia la derecha. En Java, x >> k es el desplazamiento aritmético a la derecha, y x >>> k es el desplazamiento lógico a la derecha.

Imagine una pregunta, un tipo de datos es de 32 bits, pero ¿qué sucede cuando movemos más de 32 bits? Por ejemplo, una variable de este tipo de datos se desplaza 40 bits hacia la izquierda. En C, se calcula la cantidad de desplazamiento k mod w, es decir, cuando w = 32, k = 40, en realidad desplazará 40%32=8bits.

Si las operaciones de suma y resta y cambio están involucradas en la expresión, preste atención, la prioridad de la suma y la resta es mayor que la de la operación de cambio. Es 512 en lugar de 51 (1<<2)+(3<<4).

Cómo representar enteros

Describimos dos formas diferentes de codificar enteros con bits, uno solo puede representar números no negativos y uno puede representar números negativos, ceros y enteros.

C admite muchos tipos de datos enteros, de los cuales el rango de valores de long es el único relacionado con la máquina. El rango de largo en máquinas de 32 bits es [-2147483648,2147483647], y en máquinas de 64 bits es [-9223372036854775808,9223372036854775807].

[Falló la transferencia de la imagen de la cadena externa, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-ETcS1YJW-1586855517925) (C: \ Users \ NayelyA \ AppData \ Roaming \ Typora \ typora-user-images \ image-20200414165507967.png)]
Podemos ver que el rango de valores es asimétrico, y el rango de números negativos es mayor que el entero en 1, entonces, ¿por qué es este el caso? Queremos indicar que el valor negativo se realiza mediante el complemento de dos. La mitad de los patrones de bits (números con bit de signo establecido en 1) representan números negativos, mientras que la otra mitad (números con número de signo establecido en 0) representan números no negativos, porque 0 también Es un número no negativo, todo esto significa que el número entero que se puede representar es uno menos que el número negativo.

C no requiere el uso de complementos para representar enteros con signo, pero casi todas las máquinas lo hacen.

201 artículos originales publicados · Me gusta9 · Visitantes más de 10,000

Supongo que te gusta

Origin blog.csdn.net/weixin_40992982/article/details/105516288
Recomendado
Clasificación