Detección profunda del tipo de datos en lenguaje C

Tipos de datos en lenguaje C:

  • Tipos básicos - tipos
    enteros - tipos de
    punto flotante
  • Tipo de estructura - tipo de
    matriz - tipo de
    estructura - tipo de
    unión (unión)
  • Tipo de puntero
  • Tipo de vacío (vacío)

Tres elementos del aprendizaje de tipos de datos

  1. El ancho de los datos almacenados
  2. Formato de datos almacenados
  3. Alcance (alcance)

Tipo entero

Tipos de enteros: char short int long los
tipos de enteros se dividen en dos con signo (con signo) y sin signo (sin signo)

carbonizarse 8 BITS 1 byte
corto 16BIT 2 bytes
En t 32 bits 4 bytes
largo 32 bits 4 bytes

¿Cómo probar el ancho (largo) de los tipos de datos anteriores? Muchas personas positivas usan sizeof (), strlen (), etc. De hecho, frente al desmontaje es lo más sencillo.

#include "stdio.h"

//探测数据宽度
void _test()
{
	char  i = 0xff;  //byte
	short j = 0xff;  //word
	int   k = 0xff;  //dword
	long  y = 0xff;  //dword
}

int main(int argc,char* argv[]) 
{
	_test();
	return 0;
}

función _test (), vs desmontaje generado para ella

//探测数据宽度
void _test()
{
//开栈
00CF16F0 55                   push        ebp  
00CF16F1 8B EC                mov         ebp,esp  
00CF16F3 81 EC F0 00 00 00    sub         esp,0F0h  

//保存现场
00CF16F9 53                   push        ebx  
00CF16FA 56                   push        esi  
00CF16FB 57                   push        edi  

//填充缓存区
00CF16FC 8D BD 10 FF FF FF    lea         edi,[ebp-0F0h]  
00CF1702 B9 3C 00 00 00       mov         ecx,3Ch  
00CF1707 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
00CF170C F3 AB                rep stos    dword ptr es:[edi]  

//函数本身:定义了四个变量
	char  i = 0xff;  //byte
00CF170E C6 45 FB FF          mov         byte ptr [i],0FFh		//字节宽度 byte
	short j = 0xff;  //word
00CF1712 B8 FF 00 00 00       mov         eax,0FFh		
00CF1717 66 89 45 EC          mov         word ptr [j],ax		//字节宽度 word  
	int   k = 0xff;  //dword
00CF171B C7 45 E0 FF 00 00 00 mov         dword ptr [k],0FFh		//字节宽度dword  
	long  y = 0xff;  //dword
00CF1722 C7 45 D4 FF 00 00 00 mov         dword ptr [y],0FFh		//字节宽度dword
}

//恢复现场
00CF1729 5F                   pop         edi  
00CF172A 5E                   pop         esi  
00CF172B 5B                   pop         ebx  

//降低堆栈
00CF172C 8B E5                mov         esp,ebp  
00CF172E 5D                   pop         ebp  

//函数返回
00CF172F C3                   ret

Esto debería ser muy claro, si decimos, define una variable a: long long long a; su ancho de carácter? Por la misma razón, simplemente verifique el desmontaje.

Tipo de punto flotante

Ver: Codificación de datos sobre problemas de precisión

Supongo que te gusta

Origin blog.csdn.net/qq1119278087/article/details/83834463
Recomendado
Clasificación