x86 64变量字长(x86 64编程变量兼容性)

前情提要 

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

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

基本类型长度

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

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

1、整数型

字节数类型(unsigned 修饰视为同类型)视为同类型
1字节char  byte、BYTE
2字节shortwchat_t、WORD、WCHAR
4字节int/long / floatHANDLE、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字节的变量类型编译。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值