32位系统与64位系统 C/C++通用代码

来源:互联网 发布:刷单软件 编辑:程序博客网 时间:2024/05/17 01:41

c++/C 并没有规定内建数据类型具体size;只规定了一些规则,比如int 长度不必long


数据类型长度数据类型ILP32LLP64char88int3232long3264long long6464short1616pointer3264
win32 采用数据格式是ILP32,win64采用的数据格式是LLP64。

32/64系统数据长度最大的区别在于 long ,地址长度;

1.在32系统中我们经常用int储存地址,如果在64位环境下运行,地址是64位,int 为32位,用int保存地址会发生截取。

导致地址访问错误;

下面程序,就是用int保存地址,然后打印地址错执行的字符串。

该程序在win 32/64 编译环境下测试的时候,都能正常运行!

主要原因是地址虽然是64位,但是虚拟地址没有超过0XFFFFFFFF,在进行截取的时候发生如下变化。

x86是小端存储系统,

假设地址为0X 0000 0000 00ab cdef

该地址在内存X86 内存系统中的存储为 

地址nn+1n+2n+3n+4n+5n+6n+7值efcdab0000000000当发生截取的时候

int address =P(地址)

截取低32为address的值,

address值在内存中的分布
地址MM+1M+2M+3值efcdab00
虽然发生了截取,但是地址大小没有变化。

想要该程序在64位下无法运行,首先需要是非配给字符串的地址值大于0X FFFF FFFF;

在下暂时没有想到办法,希望大家帮帮忙




void printChars(int address)
{
char * pointer;
char **pP=&pointer;
*pP=(char *)address;
printf("str %s \n",pointer);
}




int main()
{
cout<<"long length: "<<sizeof(long)<<"  pointer length"<<sizeof(long *)<<endl;
char str[]="abcdegf";
printChars((int)str);
system("pause");
return 1;
}

原创粉丝点击