1. 程式人生 > >C語言資料型別深度探測

C語言資料型別深度探測

C語言中的資料型別:

  • 基本型別
    – 整數型別
    – 浮點型別
  • 構造型別
    – 陣列型別
    – 結構體型別
    – 共用體(聯合)型別
  • 指標型別
  • 空型別(void)

學習資料型別的三個要素

  1. 儲存資料的寬度
  2. 儲存資料的格式
  3. 作用範圍(作用域)

整數型別

整數型別:char short int long
整數型別分為有符號(signed)和無符號(unsigned)兩種

char 8BIT 1位元組
short 16BIT 2位元組
int 32BIT 4位元組
long 32BIT 4位元組

怎麼證明上面這些型別的資料寬度(長度)呢? 很多正向的人會用sizeof ()、strlen()等。 其實呢,vs 看反彙編是最直接的。

#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;
}

_test() 函式,vs給它生成的反彙編

//探測資料寬度
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

這樣應該就非常清楚,假如說,定義一個a變數: long long long a;它的字元寬度呢? 同理,反彙編一查即可!

浮點型別