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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021世界人工智能大会AI Debate:图神经网络是否是实现认知智能的关键?

来源&#xff1a;学术头条2021年7月10日&#xff0c;WAIC&#xff08;2021世界人工智能大会&#xff09;“图神经网络与认知智能前沿技术论坛”在上海世博中心成功举办。清华大学计算机科学与技术系教授李涓子&#xff0c;复旦大学计算机科学技术学院教授黄萱菁&#xff0c;清华…

Tensorflow深度学习应用(筑基篇)

筑基篇 #codinggbk1.张量 用于描述数据&#xff0c;可以理解为多维数组,包含张量的名字&#xff0c;阶数&#xff0c;形状数值类型. Tensor("Add:0", shape(m,n,k), dtypefloat32),表示节点名为Add,0代表第0个输出&#xff0c;shape表示为MxNxK维的数组&…

WPF中自动增加行(动画)的TextBox

WPF中自动增加行&#xff08;动画&#xff09;的TextBox 原文:WPF中自动增加行&#xff08;动画&#xff09;的TextBoxWPF中自动增加行&#xff08;动画&#xff09;的TextBox WPF中的Textbox控件是可以自动换行的&#xff0c;只要设置TextWrapping属性为”Wrap”即可&#xff…

基因婴儿事未了!人类将在2031年开始实现永生?

来源:WPR前段时间&#xff0c;中国首例“基因编辑”婴儿事件闹得沸沸扬扬&#xff0c;这件事也发酵到了国外&#xff0c;不到一天&#xff0c;各路外媒全部刷屏了。在这些外媒报道里&#xff0c;最有意思的要数《纽约时报》杂志了。他们就“基因编辑”问题&#xff0c;请到了作…

Tensorflow深度学习应用(进阶篇)

#codinggbk进阶篇相关数据&#xff1a;标签&#xff1a;要预测的事物特征&#xff1a;用于描述数据的输入变量样本&#xff1a;数据的特定实例有标签的样本&#xff1a;{特征&#xff0c;标签}无标的样本&#xff1a;{特征&#xff0c;...}模型&#xff1a;将样本映射到预测标签…

Java之Synchronized与锁升级

Synchronized与锁升级 一、概述 在多线程并发编程中 synchronized 一直是元老级角色&#xff0c;很多人都会称呼它为重量级锁。但是&#xff0c;随着 Java SE 1.6 对 synchronized 进行了各种优化之后&#xff0c;有些情况下它就并不那么重了。 本文详细介绍 Java SE 1.6 中为…

机器学习算法

最近&#xff0c;机器学习岗位越来越火爆&#xff0c;那么自然对算法的一些能力要求也是越来越高&#xff0c;想要在求职者中脱颖而出&#xff0c;起步自然非常重要。 我和小伙伴们一起研讨了 2019 年校招的一些算法面试&#xff0c;有些是亲自经历的&#xff0c;也有伙伴分享的…

深度强化学习在智能城市领域应用介绍

来源&#xff1a;海豚数据科学实验室深度强化学习是近年来热起来的一项技术。深度强化学习的控制与决策流程必须包含状态&#xff0c;动作&#xff0c;奖励是三要素。在建模过程中&#xff0c;智能体根据环境的当前状态信息输出动作作用于环境&#xff0c;然后接收到下一时刻状…

Tensorflow深度学习应用(进阶篇)-回归(函数拟合训练)-可视化

#codinggbk进阶篇&#xff1a;多元回归&#xff1a;建模问题&#xff1a;Yx1xx1x2xw2x3xw3...xnxwnb,矩阵简化表示YXWbnumpy库基础&#xff1a;整型的一个数字&#xff0c; 不能取得其shape&#xff08;维度&#xff09;&#xff0c;通过np.array()可以将其转换成一个标量&…

Tensorflow深度学习应用(进阶篇)-1

#codinggbk 逻辑回归&#xff1a;逻辑回归需要将输出控制在[0,1]之间&#xff0c;可以使用函数将值映射在[0,1]之间Sigmod函数&#xff0c;逻辑回归一般采用对数损失函数&#xff1b;from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei] #设置显示绘图显示中文 mp…

​20210716未来智能实验室收录资料

20210716未来智能实验室收录资料特别推荐&#xff1a;置顶收录未来智能实验室在人民日报《学术前沿》发表的城市大脑最新综述研究论文和报告《城市大脑的起源、发展与未来趋势》。本期收录前沿科技进展材料52篇1.《科学》&#xff1a;媲美AlphaFold2的蛋白质结构预测新工具问世…

元宇宙深度研究报告:元宇宙是互联网的终极形态?

报告出品方&#xff1a;华安证券作者&#xff1a;尹沿技、张天、姚天航1 元宇宙&#xff1a;剑指互联网的“终极形态”1.1 元宇宙指向互联网的终极形态元宇宙&#xff08;Metaverse&#xff09;概念起源于科幻小说&#xff0c;或指向互联网的“终极形态”。Metaverse 一词来源于…

Unity基础

Unity3D 游戏开发 第一章 基础知识 Unity是一个用于创建游戏和三维互动内容的开发工具&#xff0c;是一个专业游戏引擎。 2D游戏&#xff1a;视角锁定&#xff0c;二维坐标。 3D游戏&#xff1a;任意视角&#xff0c;三维坐标。 虚拟现实&#xff08;VR&#xff09;&#x…

英特尔史上最大收购!英特尔拟300亿美元收购GF,审批成关键!

来源&#xff1a;EETOP据《华尔街日报》报道&#xff0c;知情人士称&#xff0c;英特尔打算斥资约300 亿美元收购晶圆代工大厂格罗方德&#xff08;GlobalFoundries&#xff09;&#xff0c;以加速生产更多芯片&#xff0c;如果收购成功&#xff0c;这将是英特尔有史以来最大的…

Unity 基本操作

基本操作 物体的组合 1.从需要的组合的物体中选择一个作为父对象&#xff0c;其他的物体作为子对象&#xff0c;即把子对象拖拽到父对象里&#xff0c;操作父对象即可实现整体操作&#xff0c;效果如下。 2.在组合物体中&#xff0c;父对象的坐标是该组合体的坐标&#xff0c…

OpenAI雄心勃勃的机器人计划失败了:强化学习没法用?

来源&#xff1a;机器之心曾经训练出单手解魔方机器人的 OpenAI&#xff0c;眼下已经解散了机器人团队。这家执着于实现通用人工智能&#xff08;AGI&#xff09;的公司现在放弃了机器人研究&#xff0c;理由是「数据不够丰富」。近期&#xff0c;OpenAI 公司联合创始人 Wojcie…

Unity-游戏小地图实战(前述知识点回顾与运用)

阶段知识回顾与运用---游戏中小地图实战 对于多个摄像机&#xff0c;每个摄像机都带有音频监听器&#xff0c;会出现错误&#xff0c;因为我们只需要一个音频监听器&#xff0c;为了消除错误&#xff0c;需要移除其他摄像机的音频监听器&#xff0c;只保留主摄像机的音频监听器…

NTT高级科学家:光子是深度学习的未来!光子有望替代电子计算机加速神经网络计算...

来源&#xff1a;AI科技评论作者&#xff1a;Ryan Hamerly编译&#xff1a;陈彩娴近日&#xff0c;来自日本 NTT 研究所的高级科学家 Ryan Hamerly 在 IEEE Spectrum 上发表了一篇文章&#xff08;“The Future of Deep Learning Is Photonic”&#xff09;&#xff0c;谈论了光…

Unity3D-InstantOC遮挡剔除

InstantOC&#xff08;插件&#xff09; 渲染管线 图形数据在GPU上经过运算处理&#xff0c;最后输出到屏幕的过程。对于显示出来的图形&#xff0c;CPU与GPU的分工 CPU判断需要显示的图形图像调用图形API&#xff1b;绘制调用&#xff08;Draw Call&#xff09;&#xff1a;每…

WCF系列(一)BasicHttpBinding 和 WsHttpBinding 的不同点

aaaaaaaaaaaaaaaaaa WCF系列&#xff08;一&#xff09;【翻译】BasicHttpBinding 和 WsHttpBinding 的不同点 2010-02-21 12:23 by Virus-BeautyCode, 20206 阅读, 7 评论, 收藏, 编辑 原文地址&#xff1a;Difference between BasicHttpBinding and WsHttpBinding 1、简介 WC…