Red de conocimientos sobre prescripción popular - Remedios caseros - ¿Por qué las variables enteras generan 0 como variables reales en lenguaje C?

¿Por qué las variables enteras generan 0 como variables reales en lenguaje C?

1. El formato de almacenamiento y el diseño de los números enteros y de punto flotante en la memoria son diferentes (para comprender el diseño de la memoria y la representación de los números de punto flotante, consulte: /songjinshi/article/details/ 7753777)

2. Cuando printf inserta parámetros en la pila, lo hace según el tipo de parámetros reales, en lugar de según el tipo especificado en el carácter de formato. El proceso de inserción específico es el siguiente. . Por lo tanto, el tipo de parámetros reales insertados en la pila no coincide con el tipo utilizado por la función real (la clave es que el tamaño de la memoria ocupada es diferente), por lo que el resultado como se menciona en el título aparecerá en el archivo específico. análisis, debido a que se está analizando el diseño de la memoria del número entero, será muy pequeño cuando sea un número de punto flotante, porque el número entero se almacena originalmente en 4 bytes y se analiza como un número de punto flotante de 8 bytes, por lo que el valor resultante será muy pequeño, al igual que la representación de números de coma flotante: desnormalización: cuando Cuando todos los bits binarios de E son 0, N es una forma desnormalizada.

Tenga en cuenta que el bit implícito a la izquierda del punto decimal es 0 en este momento. ¿Por qué e es igual a (1-bias) en lugar de (-bias)? Esto está diseñado principalmente para una transición suave entre valores normalizados y valores no normalizados. Continuaremos discutiendo esto más adelante.

Con la forma desnormalizada, podemos representar 0. Después de establecer el bit de signo S en 1 y establecer todos los demás bits en 0, obtenemos -0,0 de manera similar, establecer todos los bits en 0 nos da 0,0; Los números desnormalizados tienen otros usos, como representar decimales que están muy cerca de 0, y estos decimales están uniformemente cerca de 0, lo que se denomina propiedad de "desbordamiento gradual".

A continuación se publican dos fragmentos de código de desensamblado para analizar cómo se insertan los parámetros en la pila:

printf("f", 45);

00405028 mov; esi, esp

0040502A push 2Dh

0040502C push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)

00405031 call dword ptr [__imp__printf (43C124h)]

00405037 add esp, 8

printf("f", d (d es una variable entera)

00405028 mov esi, esp

0040502A mov ecx, dword ptr [d]

0040502D push ecx

0040502E push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)

00405033 call dword ptr [__imp__printf (43C124h) )]

00405039 agregar esp,8

0040503C cmp esi,esp

0040503E llamar _RTC_CheckEsp (439760h)

doble a=5 ,c;

float b;

int d=0x40a00000, y=6

int *p> char s=; 5;

p>

p=amp;d;

b=(float)a;

printf("f,f,f, f,f,f,d", b, c, (flotante)d, s, (flotante)s, y, y);

00405028 mov esi, esp

0040502A mov ecx, dword ptr [y]

0040502D push ecx

0040502E mov edx, dword ptr [y]

00405031 push edx

00405032 movsx eax, byte ptr [s ]

00405036 mov dword ptr [ebp-34h], eax

00405039 fild dword ptr [ebp-34h]

0040503C sub esp, 8

0040503F fstp qword ptr [esp]

00405042 movsx ecx,byte ptr [s]

00405046

push ecx

00405047 fild dword ptr [d]

0040504A sub esp, 8

0040504D fstp qword ptr [esp]

00405050 sub esp, 8

00405053 fld qword ptr [c]

00405056 fstp qword ptr [esp]

00405059 fld dword ptr [b]

0040505C sub esp, 8

0040505F fstp qword ptr [esp]

00405062 push offset _ORDER_SERVER_ADDRESS-0C4h (43F2ACh)

00405067 call dword ptr [ __imp__printf (43C124h)]

0040506D agregar esp, 30h

00405070 cmp esi, esp

00405072 llamar a _RTC_CheckEsp (439780h)