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架构的,从开始就是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 ;
}

  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 ;
}
结果:
Win32下:
sizeof(pInt):
sizeof(pVoid):
sizeof(pTest):
sizeof(pFunc):
请按任意键继续. . .
x64下:
sizeof(pInt):
sizeof(pVoid):
sizeof(pTest):
sizeof(pFunc):
请按任意键继续. . .

  不管指针指向张三李四还是王二麻子,都是一样大的。能够影响指针大小的,还是位数。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;

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

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

    一, 怎样判断一个exe可执行程序是32位的还是64位的? 简单的方法: 一般来说在64位的windows7下,打开任务管理器可以知道哪些程序是32位的哪些是64位的,但是因为自己的电脑是64位的wi ...

  2. WPF打包32位和64位程序 运行在ghost WIN7上问题

    WIN10,VS2015,编译平台"anycpu".WIN7系统为ghost版 1. 在.NET4.5下编译,程序打包以后,在WIN7上运行界面启动有3.4秒的延迟:将.NET版本 ...

  3. release,debug库互调用,32位,64位程序与库互调用

    以下是基于visual studio 2015和cmake的实验 1,debug或release的应用程序都可以调用release的库2,win32和x64的应用和库无法互调用,在VS中链接时会有一堆 ...

  4. Linux:使用rpcgen实现64位程序调用32位库函数

    摘要:本文介绍使用rpcgent实现64位程序调用32位库函数的方法,并给出样例代码. 我的问题 我的程序运行在64位Linux系统上,需要使用一个从外部获得的共享库中的函数,这个共享库是32位的,无 ...

  5. Linux:32/64位程序(应用程序、共享库、内核模块)

    摘要: Linux系统区分32/64位,相应地,应用程序.共享库和内核模块也区分32/64位. 本文以Ubuntu系统为例,介绍如何编译和使用32/64位的应用程序.共享库和内核模块. 1. 应用程序 ...

  6. 如何在linux 32位机器编译64位程序

    编译64位程序,不一定要编译机器是64位的,但是32位机器默认安装的gcc编译环境还是不能用来编译64位程序. 编译64位程序,需要加上-m64编译器参数,默认安装的gcc已经支持该参数,但是缺少64 ...

  7. 【转】Tomcat版本是32位、64位问题

    转载地址:http://www.cnblogs.com/greensleeves/p/3168541.html 最近遇到一个Tomcat windows安装版本是32位还是64位问题.由于一系列原因, ...

  8. ubuntu 到底是选择32位还是64位?

     ubuntu 到底是选择32位还是64位? 2011-06-03 15:16:31 标签:ubuntu linux 休闲 cpu 职场 原文出处:官方wiki原文作者:授权许可: 创作共用协议Att ...

  9. zz Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位)

    Windows 10安装教程:硬盘安装Win10 系统步骤(适合32位和64位) Posted on 2015年01月28日 by 虾虾 22 Comments   最新的Windows 10 MSD ...

随机推荐

  1. Python 爬58同城 城市租房信息

    爬取完会自动生成csv电子表格文件,含有房价.押付.链接等信息 环境 py2.7 pip install lxml pip install cssselect   #coding:utf-8 impo ...

  2. liunx 部署 spring boot

    Xshell for Xmanager Enterprise 4 (Build 0232)Copyright (c) 2002-2014 NetSarang Computer, Inc. All ri ...

  3. leetcode169

    public class Solution { public int MajorityElement(int[] nums) { Dictionary<int, int> dic = ne ...

  4. JEECG 上传插件升级-Online

    前言: 现有的uploadify上传是基于swf的,随着H5的普及,flash即将退出历史舞台,JEECG本着与时俱进的原则,将全面升级JEECG系统中的上传功能,采用新式上传插件plupload,此 ...

  5. vue.js建立一个简单的表格

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. AR涂涂乐

    <1> 涂涂乐着色 https://blog.csdn.net/begonia__z/article/details/51282932 http://www.manew.com/blog- ...

  7. psdTohtml

    https://github.com/anjorweb/fastHtml fastHtml 一个简单的psd直接导出html的工具 自己工作常用整理 适合单页面且采用DOM结构布局的H5页面,基于Ca ...

  8. 多层josn数据 修改

    var aa = { a: 1, b: { c: 1, d: 1 }, e: [{ f: 1, g: 2 }, { h: 1, i: { j: 3, k: [{ l: 55, m: [1, 2, 3, ...

  9. day43 多表查询和pymysql

    复习 增删改查全语法 # 增 insert into db1.t1(字段2, 字段1, ..., 字段n)|省略 values (值2, 值1, ..., 值n)|(值1, 值2, ..., 值n)[ ...

  10. Moment.js 基本用法

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...