为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?

一个指针在64位的计算机上,占8个字节;
一个指针在32位的计算机上,占4个字节。

原因如下:

我们都知道cpu是无法直接在硬盘上读取数据的,而是通过内存读取。cpu通过地址总线、数据总线、控制总线三条线对内存中的数据进行传输和操作。

  具体流程:

  1、cpu通过地址总线,找到该条数据;

  2、通过控制总线得知该操作是读操作还是写操作;

  3、通过数据总线将该数据读取到cpu或者从cpu写到内存中。

  所以,

  地址总线的宽度决定了CPU的寻址能力;
  数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度;
  控制总线决定了CPU对其他控件的控制能力以及控制方式

  

我们平时所说的计算机是64位、32位、16位,指的是计算机CPU中通用寄存器一次性处理、传输、暂时存储的信息的最大长度。即CPU在单位时间内(同一时间)能一次处理的二进制数的位数。
假如,某计算机的地址总线是64位,那么其一次可以在2^64种可能中寻找一个地址,也就是其描述的地址空间为0x0000 0000 0000 0000 0000 0000 0000 0000 ~ 2^64-1。
我们一般需要64个0或1的组合就可以找到内存中所有的地址,而64个0或1的组合,就是64个位,也就是4个字节的大小,因此,我们只需要8个字节就可以找到所有的数据。所以,在64位的计算机中,指针占8个字节。同理,在32位的计算机中,指针占4个字节。

同时也可以看出,由于地址总线为64,那么每次寻址的空间为0x0000 0000 0000 0000 0000 0000 0000 0000 ~ 2^64-1,那么CPU的最大内存为2^64Byte

举个例子

内存地址就像一条路上的门牌号,用几位表示需要看门牌数量。
门牌好从0号开始编排,到2^64-1号结束,一共就有2^64个门牌号。分别为二进制的
000000000000000000000000000000000000000000000000000000号
000000000000000000000000000000000000000000000000000001号
000000000000000000000000000000000000000000000000000010号
最后
1111111111111111111111111111111111111111111111111111111111110号
1111111111111111111111111111111111111111111111111111111111111号
每个门牌的号码是64位(二进制),一个字节为8位,64位就是8字节。

也就是在64位系统中,cpu会通过地址总线在2^64个地址中寻找其中的某一个地址值的数据,所以8个字节的指针就可以代表内存中任意位置的一个地址值,所以指针占8个字节就足够用了。

其他知识点:

数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。
1bit就是二进制的0和1
1字节(Byte) = 8位(bit)=8比特
1个英文字母(不分大小写)占一个字节的空间
计算机能够处理的最小单元是 字节 而不是位

常用数据类型所占用的内存空间:

/*部分数据类型的取值范围:
int:-2147483648~2147483647
unsigned int:0~4294967295
short:-32768~32767
unsigned short:0~65535
long: -2147483648~2147483647
unsigned long:0~4294967295
*/

原文地址:https://www.cnblogs.com/gaoxiaoniu/p/10677754.html

时间: 2024-11-05 18:49:51

为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?的相关文章

ubuntu 64位android项目报错的解决方案,打开64位 Ubuntu 的32位支持功能

ubuntu的64位下的android环境,说实话,还真得费点精力了,解决一个问题,又出来一个新问题. 小编昨天刚好不容易将android的环境搭建好了,这不,刚建了个项目,直接就报错,下面是罗列出的几条: 1. libstdc++.so.6:cannot open shared object file:no such file or directory 2. Description Resource Path Location Type Error executing aapt: Cannot

尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。

从10G开始,Oracle提供了一个较为轻量级的客户包,叫做Instant Client. 将它安装好后,就不用再安装庞大的Oracle Client了. 这样一来,只要客户端下载Instant Client,直接解压,设置Path就ok了.具体设置如下:1.下载32位Oracle InstantClient 2.将Oracle InstantClient解压到某目录 3.打开PL/SQL,在perference里面设置OCI Library和Oracle_home,例子如下:        

.net程序错误:BadImageFormatException....如果在安装32位Oracle客户端组件的情况下以64位模式运行

OracleClient 程序要连oracle数据库,提示如下错误: 数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题. 1.IIS部署时 网上搜索了一下,有各种办法,试过多安装了一个64位的oracle11g客户端,还是不行.后来想到是否是iis的问题,之前配置iis的时候好像碰到过32位64位的一个设置,看了以前的博客之后把应用程序池做了如下设置

如果在安装32位Oracle客户端组件的情况下以64位模式

1.Oracle客户端32位和64位都可以连接Oracle服务端.所以“如果在安装32位Oracle客户端组件的情况下以64位模式”这个错误,不是Oracle本身的问题. 2.错误原因:应用程序和本机安装的Oracle客户端版本不一致的问题: 即:应用程序:64位   本机安装的Oracle客户端为32位. 解决方法:本机安装Oracle客户端64位. 我的本机是win7-64位,vs2005是32位,但我的工程编译的是:anycpu,因为我本机操作系统是64位,因此anycpu编译出来就是64

Asp.net_解决vs运行报在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题的bug方法

环境:操作系统win10 64位,开发工具vs2015 社区版,服务器数据库oracle 11g 64位,本机客户端oracle client 11g 64位,PLSQL Developer 也是64位版 以上开发环境,PLSQL Developer可以正常连接服务器数据库,然而运行项目代码后报以下错误: “System.InvalidOperationException”类型的异常在 System.Data.OracleClient.dll 中发生,但未在用户代码中进行处理 其他信息: 尝试加

IIS发布后出现“如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”错误

VS2010运行程序没有任何问题,但是发布到IIS以后,连接数据库时报错:“尝试加载 Oracle 客户端库时引发 BadImageFormatException.如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题.”,解决方法为: IIS应用程序池---高级设置----启用32位应用程序设为“TRUE”----加载用户配置文件设为“TRUE”

Win10中virtualbox新建虚拟机不能设置64位系统解决

问题描述 在Win10中,安装virtualBox后,新建虚拟电脑时,所有的操作系统都没有64位. 解决 进入控制面板->卸载程序->启用或关闭windows功能->取消hyper-v前面的勾. 版权声明:本文为博主原创文章,未经博主允许不得转载.

[Oracle] - 使用32位 PLSQL(PL/SQL Developer)登陆64位Oracle失败之解决

配置环境 Oracle服务端oracle_winx64_12c_database.iso Oracle客户端instantclient-basiclite-nt-12.1.0.1.0.zip 集成开发环境PL/SQL Developer 10.0.5.1710 配置步骤 确保 Oracle 已经完成配置,并可以使用 SQL Plus 登陆成功. 如果使用 PL/SQL 登陆 Oracle 失败,错误提示如下: 登陆失败原因分析:64位 Oracle 安装路径:E:appAdministrator

安装SQL 2005 出现警告 ,32位ASP.NET已经注册,需要注册64位

将64位.net注册到iis上 cscript C:\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 0 C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis.exe -i 将32位.net注册到iis上 cscript C:\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools