32 bit 与 64 bit 程序(2)比较

32 bit  与 64 bit 程序(2)区别

  由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件。

几个重要概念:

 (1)这里所说的的32位与64位程序,是指经过编译器编译后的可执行文件,例如像Windows上的exe文件,而最初编写的源码并没有32位和64位之说。

(2)不是所有的程序需要区分32位和64位,对于原生语言例如C语言编写的程序需要区分64位与32位,但是对于像Java这样的语言,就不需要这样了,因为Java编写的程序是在JVM(Java虚拟机)上运行的,JVM屏蔽了具体的硬件细节。

(3)32位与64位的程序的本质区别在于:两者最终在处理器CPU上运行的指令是不一样的

  

  平台的所指的是:CPU +OS + 软件 

  软件: 【源码】 + 编译器 【64/32】= exe【64/32】

一、处理器CPU的不同(64bit, 32bit):

  主要是指:64位CPU,32位CPU, 对于历史中的16bit的处理器,则不是当今主流不讲。

  注意:CPU的不同bit ,内部的指令集,操作位数,寄存器名称和个数都不同

一、比如一条mov eax,1指令,可能在32bCPU上对应的机器指令是0x1201;在64位机器上就是0x123401。
二、64位CPU里的寄存器是64位的,这样CPU每次处理的数据量也就更大,32位CPU寄存器是32位的。
三、64位CPU里的寄存器数量也多于32位CPU。
四、32位CPU的地址总线不一定是32位的,还有可能是48位的,同样64位的CPU地址总线也不一定是64位,往往都是48位。
五、现在对于主流的处理器,64位的CPU是能够兼容32位指令架构的!!!!!!

(1)从上面可以看到64位CPU的运算能力理论上比32位CPU强很多。

(2)现在32位的CPU一般是X86架构的,从80386开始就是32位的CPU,也对应他的32位指令集。

(3)后来发展出64位CPU,从X86扩展出64位的指令集,一般我们就叫做X64,也叫AMD64架构,因为最早是AMD推出64位CPU的。

 

二、操作系统OS(64bit, 32bit):

1. OS与CPU的关系

(1)32位的操作系统是专门为32位CPU设计的,同样64位的操作系统是为64位的CPU设计的。

(2)前面也说了,64位的CPU能够兼容32位指令架构,因此在64位CPU上也可以安装32位操作系统。

(3)32bit的操作系统安装再32bit CPU, 64bit 的OS安装再64bit CPU才能将OS发挥最大优势。

(4)32bit的编译器也可以编译64bit 的程序。

2. 寻址空间的影响

   64bit CPU拥有更大的寻址能力,使用最大为192GB内存,而32bit只支持4G内存.

  64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会提升1倍。但这是建立在64bit操作系统,64bit软件的基础上的。

    

  之所以叫做“64位处理器”,是因为电脑内部都是实行2进制运算,处理器(CPU)一次处理数据的能力也是2的倍数。8位处理器、16位处理器、32位处理器和64位处理器,其计数都是2的倍数。一次处理的数据越大,该电脑处理信息的能力越来越大;因此64位处理在先天就比32位处理器具有快速的能力。那为什么不用更高级的128位处理器呢?因为位数越高,处理器芯片的设计也就越复杂,目前的技术水平暂时无法制造这么复杂的芯片。

3. 程序软件【32bit, 64bit】

(1)32位的程序就是将源码用32位的编译器编译的,64位的程序就是将源码用64位的编译器编译的。

(2)应用程序只接触逻辑地址,并不接触真实的物理地址。

  32位的程序理论上可以申请利用4GB的地址空间,64位的程序则可以申请利用大于4GB 的地址空间,这也是64位程序的一个巨大优势。

  我们知道应用程序的运行是需要操作系统作为支撑的,这些程序在运行时常常需要进行一些系统调用,还有各种库函数等。

这些可执行文件【exe】能否顺利运行有着两个最重要的地方。

1)动态链接库。
2)系统API。

  对于Windows系统而言,64位的系统往往还具有32位系统的库,因此在64位系统上能够运行32位的程序,但是反过来就不行了,因为32位系统一般没有64位系统的库。

  可以通过博客:https://www.cnblogs.com/icmzn/p/10269911.html

  再64bit 的 Window系统中,32bit 的exe 调用的是目录下的系统dll:C:\ Window\SysWOW64\....,这里的SysWOW64,表示的意思是: 32bit 的软件在Window 64 位OS上运行的32bit 的dll 系统文件。

  64bit 的exe则调用的目录的系统dll: c:、Window\Win32\... 

  注意:这里的Win32可能是历史遗留问题,这样对于Window 64 的改动较小,我猜测的,哈哈哈

  

  64exe 调用的64bit OS的系统dll文件

  

  

64bit 处理器优势:

(1)硬件, 执行速度更快, 更大的内存管理。

(2)软件, 最新的尖端软件首选64bit 操作系统作为开发平台。

64bit处理器劣势:

(1)硬件, 部分的驱动程序对64bit 的系统支持不高, 例如对于工业控制领域,更多的模块提供了32bit 的控制库文件,而没有64bit的版本。

(2)软件, 由于操作系统是64bit 的,导致很多历史中的32bit 的exe 不能再64系统上兼容,可能出现计算误差。

2. 代码中的基本的数据类型,会根据操作系统的位数分配内存大小:

  因此在64位上对int型数据操作,编译生成32的程序,有可能导致int型越界,软件出现问题

不同的平台上对不同数据类型分配的字节数是不同的,数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)

常用数据类型对应字节数:

 可用如sizeof(char),sizeof(char*)等得出

  测试程序:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;  

//main
int _tmain(int argc, _TCHAR* argv[])
{
    cout << "sizeof(char):" << sizeof(char) << endl;
    cout << "sizeof(short):" << sizeof(short) << endl;
    cout << "sizeof(int):" << sizeof(int) << endl;
    cout << "sizeof(long):" << sizeof(long) << endl;
    cout << "sizeof(long long):" << sizeof(long long) << endl;
    cout << "sizeof(unsigned int):" << sizeof(unsigned int) << endl;
    cout << "sizeof(float):" << sizeof(float) << endl;
    cout << "sizeof(double):" << sizeof(double) << endl;
    void* pointer;
    cout << "sizeof(pointer):" << sizeof(pointer) << endl;  

    system("pause");
    return 0;
}  

  32bit 的编译器下测试输出:数据类型长度

  

  64 bit 的编译器下测试输出:数据类型长度

  

注意:

(1)32位和64位系统在Windows下基本数据类型的大小都是一样的。只有指针的大小不一样!32位指针大小为4byte,而64位的指针大小为8byte。

(2) Linux下,long型是64位的,这一点是和Windows不同的地方。

  

  为什么Windowsx64下long也为4byte?

  正常标准的话,long应该也是64位即8byte。但是在Windows下,我们的结果却是4byte。为什么会这样呢?

因为:

  我们编程时很少关注数据类型真正的大小,毕竟即使不关注这个也可以编程,而且我们习惯了Win32,到64位下,只有指针因为寻址需要是必须变成64位的,64位的指针寻址范围是0~2^64-1,而其他的数据类型基本已经够用,如果把所有数据类型变成64位,明显是浪费空间。再者,为了让32位和64位程序兼容运行,能少修改还是少修改,所以Windows仅将指针大小进行了修改。这样,程序可以兼容运行。

  

 指针的大小比较?

  int类型指针,通用指针void*, 类指针, 函数指针的长度确定:

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;  

class Test
{
    int num;
    string name;
};
//一个函数指针
typedef void(*pFunc)(void);
void PrintHello(void)
{
    cout << "hello world" << endl;
}
//main
int _tmain(int argc, _TCHAR* argv[])
{
    int* pInt;
    void* pVoid;
    Test* pTest = new Test();
    pFunc pfunc = PrintHello;
    cout << "sizeof(pInt):" << sizeof(pInt) << endl;
    cout << "sizeof(pVoid):" << sizeof(pVoid) << endl;
    cout << "sizeof(pTest):" << sizeof(pTest) << endl;
    cout << "sizeof(pFunc):" << sizeof(pfunc) << endl;  

    system("pause");
    return 0;
}  
结果:
Win32下:
sizeof(pInt):4
sizeof(pVoid):4
sizeof(pTest):4
sizeof(pFunc):4
请按任意键继续. . .
x64下:
sizeof(pInt):8
sizeof(pVoid):8
sizeof(pTest):8
sizeof(pFunc):8
请按任意键继续. . .

  不管指针指向张三李四还是王二麻子,都是一样大的。能够影响指针大小的,还是位数。32位下指针大小为4,64位下指针的大小为8.



总结:

(1)32位升级到64位不是简单的重新编译发布一下就可以了。举个例子,在32位C语言环境里一个指针可以放入一个int型的变量中,但在64位里就不行了了,因为64位程序里的指针为64位,这样的话程序肯定就爆了,因此对于某些程序如果想要升级到64位,则需要修改源码,这个工作是相当繁琐的。

(2)由于64位操作系统的寻址和偏移的问题,也有可能导致程序在运行过程中,计算结果与32位系统不一致 

(3)64位CPU可以运行32位或者64位的操作系统,64位操作系统可以运行32位或64位程序。

(4)32位CPU只能安装32位的操作系统,而32位操作系统只能运行32位的程序。

(5),第一个64位的程序是怎么来的,因为那个时候还没有64位的编译器,其实很简单,32位的编译器也可以编译出64位的程序 ,当然这个问题就没有必要深究了

endl;

原文地址:https://www.cnblogs.com/icmzn/p/10269868.html

时间: 2024-10-06 23:09:56

32 bit 与 64 bit 程序(2)比较的相关文章

32位和64位程序兼容性

最近项目需要将之前开发的32位程序迁移到64位操作系统.对于上层应用程序而言没有什么特别的差异.对于底层程序例如嵌套汇编等对寄存器的操作需要考虑这个问题,不同点在于字节对齐,寄存器操作和指令的不同. 对齐单位32位和64位是不一样的. 寄存器,32位的有eax.ebx,而64位操作系统是rax.rbx. 指令:32位的pushl.addl.movl,而64位中是push.add.mov

32 bit 与 64 bit 程序(1)如何识别?

一, 怎样判断一个exe可执行程序是32位的还是64位的? 简单的方法: 一般来说在64位的windows7下,打开任务管理器可以知道哪些程序是32位的哪些是64位的,但是因为自己的电脑是64位的windows 10,在任务管理器中有些任务即使是32位的,也不提示. 1. 通过是否能在32bit 系统上运行的的方法 (1)如果你使用的是32位的电脑,则可以运行的程序一定是32位的:而不可以运行的程序可能是64位的,也可能是程序存在问题或系统存在问题导致不能运行. (2)如果你使用的是64位的电脑

关于如何生成32位/64位程序的问题

生成32位/64位程序不是由所在操作系统的位数决定的(意思是在32位系统下生成的不一定是32位,同理在64位下生成的也不一定是64位),这主要由编译器的位数决定的. 要生成32位/64位的程序需要在编译环境中选择相应的编译器(32位/64位)即可. 这里以vs2008 (生成64位程序)为例: 在解决方案中打开配置管理器,点击选择新建解决方案平台,选择x64平台,编译生成就可以了. 如果没有该选项,则需要安装相应x64编译器

判断应用程序是32位还是64位

VC++检测可执行程序DLL.EXE等是32位还是64位 1.首先介绍PE结构 Windows系统下的可执行文件,是基于Microsoft设计的一种新的文件结构,此结构被称之为PE结构.PE的意思是Portable Executable(可移植的执行体),所有Win32执行体都是用PE文件格式,其中包括SYS.DLL.EXE.COM.OCX等.(不管是学习逆向.破解还是安全,了解PE文件格式都是非常必要的.) PE文件的第一个部分是IMAGE_DOS_HEADER,大小为64B,这里面有两个重要

在32位、64位操作系统下各数据类型所占的字节数

点击打开链接 在32位.64位系统当中,唯一改变的是指针的长度;在32位系统当中是4个字节.64位则是8个字节.所谓的32位.64位,这个指的是寄存器的位宽. 32位平台下结果: 64位平台下结果: 一.下面几点是值得大家注意的: 1.关于 int 的取值范围,缺省的int数值范围是由编译器设计者决定的,通常都是机器最为自然高效的位数.甚至,我们在32位的机器上,前提没有什么指令可以高效的的处理更短的整型值,我们可以将short.int.long都设置成32位. 2.浮点数在缺省的情况下 表示的

驱动级多开工具,支持32位和64位

标题:[原创]驱动级多开工具,支持32位和64位 作者:绿林科技 时间:2015-5-16 链接:http://blog.csdn.net/o6108/article/details/47790019 作者QQ:1473656864 技术交流群1:177822108 技术交流群2:177822398 通用驱动级多开器,可多开市面上的90%的程序. PS:本来想弄个收费版本的,后来想了想,决定弄成免费.店铺为更新软件版本用的. 软件的About页面有我的QQ和Q群号,请大家把使用过程中遇到的BUG

iis6.0 32为和64位的切换

简介 更多信息 ASP.NET 1.1(32 位版) ASP.NET 2.0(32 位版) ASP.NET 2.0(64 位版) 基于 x64 版本 Microsoft Windows 的技术支持 参考 属性 提供反馈 简介 本文讨论如何在 64 位版本的 Microsoft Windows 上,在 32 位版本的 Microsoft ASP.NET 1.1 和 32 位及 64 位版本的 ASP.NET 2.0 之间切换. 当您同时安装了这两个版本的 ASP.NET 时,如果没有使这两个 AS

VS2012编译64位程序

安装64位操作系统不是编译64位程序的必要条件,关键是要装64位程序的编译器. 1. 选择“Build” – “Configuration Manager”菜单,打开配置管理器.点击新建解决方案平台. 2. 选择“x64”平台,点击确定按钮. 3. 这时候配置管理器中的平台已经改成刚才选择的x64了,这时候编译出来的就是64位程序了.可以在工具栏的平台下拉框中快速切换目标平台. 注意:一个工程调用的另一个工程的DLL时,位数必须一致,即本工程要编译为64位,DLL也必须编译为64位.如果本工程要

Adobe Photoshop CC 14.0简体中文特别版32位和64位下载

原文地址:http://brushes8.com/47555.html 什么是Adobe Photoshop CC 14.0 继去年Adobe推出Photoshop CS6版本后,Adobe又在MAX大会上推出了最新版本的Photoshop CC (Creative Cloud).在主题演讲中,Adobe宣布了Photoshop CC (Creative Cloud)的几项新功能,包括:相机防抖动功能.Camera RAW功能改进.图像提升采样.属性面板改进.Behance集成.同步设置以及其他