前情提要 

        在x86 和x64的目标程序兼容上,并非手指点一点就能完成程序的转换。如果这么简单32位程序早就换代啦。

很重要的一点是,在x86和x64上cpu寄存器以及寻址等硬件相关的参数都由于32位对应或地扩充到了64位字宽,但是编程中32和64选择编译的时候,以windows平台举例,仅有void*相关类型会自动根据选择的目标版本从x32扩充到x64。没想到把,也就是说,除了和内存寻址相关的地方,其余的数据类型压根就不会简单点一下就扩充为64程序。因此简单的切换目标版本编译的程序只是新瓶装旧酒。

基本类型长度

我们这里讲的基本类型是指关键字的原生支持类型,非封装实现。并且我们需要理解,变量类型只在源代码阶段有用,在编译后,没有类型可言。在内存只存在字长和整数与浮点的区分。

其次,有符号和无符号仅仅是在运算溢出以及位移等时候处理方式不同,依旧是在逻辑认知的情况下人们定义的。所以我们这里抛开这些干扰,以为字长作为唯一标准,同样字长相当符号类型相同,你可以任意使用强制转换,编译后结果都是一样的。

1、整数型

字节数

类型(unsigned 修饰视为同类型)

视为同类型

1字节

char 

byte、BYTE

2字节

short

wchat_t、WORD、WCHAR

4字节

int/long / float

HANDLE、LONG、DWORD

8字节

long long / double

ULONGLONG、所有8字节联合体

4/8字节

void*

char*、wchar_t*、int*等所有指针类型

        注意:linux中似乎long 类型会随目标位数在在 32位和 64字长进行切换,window下与int相同。

显而易见,只有指针类型会根据你编译时选择的目标版本,编译器自动切换为系统字长。其他的变量,通通都是定死的字长。所以一个大的程序32转64有多麻烦可想而知,稍微一个没有改,内存溢出,崩了。

解决办法

因此我们可以结合宏 以及 typedef关键字实现根据不同版本实现自动切换变量字长。

        如:

#ifdef _WIN64
	typedef unsigned long long sysword;
#else
	typedef unsigned int sysword;
#endif // DEBUG

sysword类型,使用该类型代替int 等原生4字节即可实现在切换目标版本时候自动替换为4字节或8字节的变量类型编译。