C語言資料型別深度探測
阿新 • • 發佈:2018-12-22
C語言中的資料型別:
- 基本型別
– 整數型別
– 浮點型別 - 構造型別
– 陣列型別
– 結構體型別
– 共用體(聯合)型別 - 指標型別
- 空型別(void)
學習資料型別的三個要素
- 儲存資料的寬度
- 儲存資料的格式
- 作用範圍(作用域)
整數型別
整數型別: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;它的字元寬度呢? 同理,反彙編一查即可!