C语言数据类型深度探测

C语言中的数据类型:

  • 基本类型
    – 整数类型
    – 浮点类型
  • 构造类型
    – 数组类型
    – 结构体类型
    – 共用体(联合)类型
  • 指针类型
  • 空类型(void)

学习数据类型的三个要素

  1. 存储数据的宽度
  2. 存储数据的格式
  3. 作用范围(作用域)

整数类型

整数类型:char short int long
整数类型分为有符号(signed)和无符号(unsigned)两种

char8BIT1字节
short16BIT2字节
int32BIT4字节
long32BIT4字节

怎么证明上面这些类型的数据宽度(长度)呢? 很多正向的人会用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;它的字符宽度呢? 同理,反汇编一查即可!

浮点类型

见:数据编码于精度问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值