Almacenamiento de datos en lenguaje C.

Tabla de contenido

1. tipo de datos

1. familia entera

2. Familia de coma flotante

 3. Tipo de estructura

(1), tipo de matriz:

(2), tipo de estructura:

(3), tipo de enumeración:

(4), tipo de articulación:

 4. Tipo de puntero

 5. tipo vacío

En segundo lugar, el almacenamiento de números enteros en la memoria.

 3. Almacenamiento de números de coma flotante en la memoria.

1. Reglas de almacenamiento para números de coma flotante

2. Almacenamiento de números de coma flotante para los tres valores de S, M y E

3. Tres situaciones en las que el índice E se elimina de la memoria.

(1) El caso en el que E no es todo 0 o no todo 1

(2) El caso en el que E es todo 0

(3) El caso en el que E es todo 1

 4. Almacenamiento de orden de bytes endian grandes y pequeños



1. tipo de datos

Después del estudio anterior, aprendimos que los tipos de datos en lenguaje C son aproximadamente:

char, short, int, long, long long, float, duplica   estos tipos

Para obtener más información, consulte los tipos de datos de la primera introducción al lenguaje C que publiqué anteriormente .

Se puede dividir en los siguientes tipos:

1. familia entera

Incluye los tipos char, short , int y long , que se dividen en dos tipos: firmado y sin firmar .

Entre ellos, los firmados se expresan como: firmado... ,

La representación sin firmar es: sin firmar...

Por ejemplo, el tipo de entero con signo es: int con signo , tipo de entero corto sin signo: corto sin signo [int] (int se puede escribir o no)

Por supuesto, algunos estudiantes cuidadosos descubrirán por qué hay datos de tipo char en la familia de enteros.

De hecho, aunque char es un tipo de carácter, el tipo char almacena su valor de código Ascii en la computadora y el valor del código Ascii es un número entero , por lo que el tipo char se incluye naturalmente en la familia de enteros.

Tenga en cuenta que si se trata de datos con un bit con signo, el bit más alto es el bit de signo , y si el bit más alto es 0 , significa un número positivo , y si el bit más alto es 1 , significa un número negativo

Si se trata de datos sin signo, el bit más alto también es un bit de datos y no hay 0/1 positivo ni negativo.

Solo recuerda los puntos anteriores.


2. Familia de coma flotante

Se llama familia de números de punto flotante, por lo que los miembros de esta familia son naturalmente de tipo flotante y doble.

Entre ellos, todo el mundo sabe que float es un tipo de punto flotante de precisión simple y double es un tipo de punto flotante de doble precisión.

Esta familia es muy sencilla, la conocemos bien, así que pasemos a la siguiente familia.


 3. Tipo de estructura

Los tipos construidos también se conocen como tipos personalizados.

Dividido en las siguientes cuatro categorías, a saber: tipo de matriz, tipo de estructura, tipo de enumeración, tipo de unión

Hablemos de estos tipos en detalle.

(1), tipo de matriz :

¿Por qué se dice que el tipo de matriz es un tipo personalizado? La razón es muy simple, por ejemplo, todos entenderán el motivo.

Por ejemplo: int arr[10] , para crear dicha matriz, luego elimine el nombre de la matriz arr , el int [10] restante es el tipo y, por ejemplo, char p[20], elimine el nombre de la matriz p, el resto char [20] es el tipo, por lo que al crear una matriz, hay muchos tipos y todos se crean de acuerdo con sus propias necesidades, por lo que el tipo de matriz naturalmente se llama tipo construido o tipo personalizado. 

(2), tipo de estructura :

La estructura tiene la palabra clave struct, la estructura es para crear un nombre y luego crear miembros en él, y los miembros pueden asignar sus propios valores. Por ejemplo, si define una estructura Estudiante, puede establecer el nombre en ella: char nombre[20], edad : int edad , número de estudiante: char id[20] , etc., ¡naturalmente también pueden denominarse tipos estructurales!

~~~~ Con respecto al contenido específico de la estructura, se publicará un blog en un futuro próximo para compartir el conocimiento.

(3), tipo de enumeración:

La palabra clave del tipo de enumeración es: enum , que expliqué en detalle en el blog anterior: las palabras clave del lenguaje C por primera vez y cómo usarlas. Preste atención a mi blog anterior.

(4), tipo de articulación:

La palabra clave del tipo de unión es: unión. Todo el mundo sabe que este tipo la tiene. No necesitas saber demasiado. Si estás interesado, puedes consultar la información online para aumentar tus conocimientos.


 4. Tipo de puntero

Existen aproximadamente los siguientes tipos de punteros, que deberían ser familiares para todos

int* p,char* p,flotante* p,void* p

Lo único a lo que debemos prestar atención es al último puntero vacío, que nunca hemos visto antes, solo entiéndelo.


 5. tipo vacío

void representa un tipo vacío (sin tipo )

Esto generalmente se aplica al tipo de retorno de la función , al parámetro de la función y al tipo de puntero mencionado anteriormente , etc.


En segundo lugar, el almacenamiento de números enteros en la memoria.

Hablando de almacenamiento en memoria, primero debe comprender los tres conceptos de código original, código inverso y código complementario.

Código original:

Está bien traducir directamente el valor al binario en forma de números positivos y negativos.

Código inverso:

El bit de signo del código original permanece sin cambios y los otros bits se invierten bit a bit.

complementar:

Inverso +1 para obtener complemento

Atención Nota: ¡ Lo que se almacena en la memoria es el complemento de los datos! !

Estas tres representaciones tienen bits de signo y bits de valor, bits de signo: 0 significa positivo, 1 significa negativo

Para números positivos , el código original, el código inverso y el código complementario son los mismos

Por ejemplo: int a = 1; el bit de signo de a es positivo, entonces el bit más alto de a es 0

Entonces el código original de a es: 00000000 00000000 00000000 00000001, el código inverso del número natural positivo a, y el código complementario es naturalmente este

Tenga en cuenta aquí: debido a que a es un número entero, ocupa cuatro bytes y 32 bits, por lo que el código original es una secuencia binaria compuesta de 32 0 y 1.

Para números negativos, satisface la conversión mutua del código original, el código inverso y el código complementario mencionados anteriormente, demos un ejemplo.

int b = -1; el bit de signo de b es negativo, entonces el bit más alto de b es 1

Entonces el código original de b es: 10000000 00000000 00000000 00000001

El código inverso de b es: 11111111 111111111 11111111 11111110 ( el bit de signo permanece sin cambios y los demás bits se invierten )

El complemento de b es: 11111111 111111111 11111111 11111111 ( complemento +1 )

Se puede observar que lo que b almacena en memoria es el complemento de b: 11111111 111111111 11111111 11111111

¡Este es el fin del almacenamiento de conocimientos de números enteros en la memoria!


 3. Almacenamiento de números de coma flotante en la memoria.

1. Reglas de almacenamiento para números de coma flotante

Según los estándares internacionales, cualquier número binario de coma flotante V puede representar la siguiente forma:

(-1)^S*M*2^E

(-1)^S representa el bit de signo , cuando S=0 , V es un número positivo , cuando S=1 , V es un número negativo

M representa un número válido , M es mayor o igual a 1 y menor que 2

2^E significa bit exponente

Pongamos un ejemplo para ilustrar estos tres valores en detalle.

9.0 está escrito en forma binaria como: 1001.0

1001,0=(-1)^0 * 1,001* 2^3

Es decir, S=0, M=1.001, E=3, ¡todos pueden entenderlo más profundamente según este ejemplo!

2. Almacenamiento de números de coma flotante para los tres valores de S, M y E

regulación estándar:

Para números de punto flotante de 32 bits ( números de punto flotante de precisión simple: float ), el bit más alto es el bit de signo S , los siguientes 8 bits son el exponente E y los 23 bits restantes son el número efectivo M.

Para números de punto flotante de 64 bits ( números de punto flotante de doble precisión: double ), el bit más alto es el bit de signo S , luego 11 bits son el exponente E y los 52 bits restantes son el número efectivo M.

Nota: Cuando se almacena el número efectivo M, se puede omitir 1, porque M debe estar precedido por 1, y se puede almacenar un bit más cuando se omite.

El índice E es más complicado. Primero, E es un entero sin signo. El rango de valores de 8 bits es: 0~255, y el rango de valores de 11 bits es: 0~2047. Sin embargo, E puede tener números negativos y el El estándar estipula: agregue un número intermedio al almacenar en E, +127 para 8 dígitos , +1023 para 11 dígitos.

Dejame darte un ejemplo.

flotador f = 5,5;

5.5 convertido a binario es 101.1, entonces 101.1=(-1)^0 * 1.011 * 2^2

S=0,M=1,011,E=2+127=129

Luego almacene en la memoria:

El binario es: 0 10000001 01100000000000000000000

Convertir hexadecimal a: 0x 40 b0 00 00

3. Tres situaciones en las que el índice E se elimina de la memoria.

(1) El caso en el que E no es todo 0 o no todo 1

Resta 127 (o 1023) del valor calculado del exponente E para obtener el valor real y luego suma el número efectivo M al primer dígito 1.

(2) El caso en el que E es todo 0

El exponente E del número de coma flotante igual a 1-127 (o 1-1023) es el valor real, M no suma el primer 1, sino que lo restablece a un decimal de 0. números pequeños

(3) El caso en el que E es todo 1

Representa infinito positivo y negativo (positivo o negativo depende del bit de signo S)

Nota: Principalmente necesita comprender la primera situación , y solo necesita comprender la segunda y tercera situaciones.


 4. Almacenamiento de orden de bytes endian grandes y pequeños

Hablando de almacenamiento endian grande y pequeño, es posible que haya oído hablar de este concepto, así que a continuación, primero comprendamos el concepto básico de almacenamiento endian grande y pequeño.

Almacenamiento big endian:

Almacene los datos en el byte bajo de un dato en la dirección alta y almacene los datos en el byte alto en la dirección baja

Almacenamiento little-endian:

Almacene los datos en el byte bajo de un dato en la dirección baja y almacene los datos en el byte alto en la dirección alta

Déjame explicarte el concepto.

Por ejemplo: creo un número entero a, expresado en forma hexadecimal

int a = 0x11 22 33 44; 0x aquí es el signo hexadecimal, 11 es el bit más alto y 44 es el bit más bajo

Entonces, por ejemplo, de izquierda a derecha en la memoria , la dirección es de dirección baja a dirección alta , como se muestra en la figura:

La siguiente imagen muestra el almacenamiento big-endian :

 La siguiente imagen muestra el almacenamiento little-endian :

 

Después de la verificación, se demuestra que el compilador VS  que usamos habitualmente es un almacenamiento Small-Endian . Los estudiantes que estén interesados ​​en otros compiladores pueden venir y verificarlo por sí mismos.


Lo anterior es el contenido relacionado con el almacenamiento de datos del que hablamos hoy. ¡Nos vemos en el próximo blog! !

Supongo que te gusta

Origin blog.csdn.net/m0_64411530/article/details/123720764
Recomendado
Clasificación