文章目录
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;它的字符宽度呢? 同理,反汇编一查即可!