32位与64位区别与编译器数据模型简介

一、32位与64位区别


  •  32位和64位机器。

       32位和64位指的是机器字长,即CPU能同时处理的数据的最大宽度。一台电脑机器主要由CPU、内存、IO设备、总线组成,称电脑机器是64位是指以上设备都支持64位。

  • 32位和64位操作系统。

       从硬件理论上说,64位机器的总体处理速度约为32位机器的2倍。操作系统依赖机器但又不完全依赖它。软件兼容性上,32位操作系统能轻易的做到分别运行在32位机器和64位机器上,而且运行的很流畅,只须做到寻址上利用前面的32位。但当64位操作系统运行在32位操作系统上时却无法流畅运行甚至无法运行。这是由于64位操作系统(软件)不支持32位寻址造成的(内存溢出),或64位操作系统转为32操作时的兼容性处理过于繁琐影响了系统运行速度。



二、编译器数据模型简介


    编程语言上的32位与64位差异主要体现在基本类型的位长上。C/C++等语言仅仅定义了这些基本数据类型之间的关系,并没有严格定义它们的字长。不同操作系统平台上,根据编译器不同的实现,它们的字长如下表所示:

 

数据类型

 

LP64

 

ILP64

 

LLP64

 

ILP32

 

LP32

 

char

 

8

 

8

 

8

 

8

 

8

 

short

 

16

 

16

 

16

 

16

 

16

 

_int32

 

N/A

 

32

 

N/A

 

N/A

 

N/A

 

int

 

32

 

64

 

32

 

32

 

16

 

long

 

64

 

64

 

32

 

32

 

32

 

long long

 

N/A

 

N/A

 

64

 

N/A

 

N/A

 

pointer

 

64

 

64

 

64

 

32

 

32

 

    其中,LP64,ILP64,LLP64是64位平台上的字长模型,ILP32和LP32是32位平台上的字长模型。LP64指long和pointer是64位,ILP64指int、long和pointer是64位,LLP64指long long和pointer是64位,ILP32指int、long和pointer是32位,LP32指long和pointer是32位的。32位windows采用的是ILP32数据模型,64位windows采用的是LLP64数据模型,故在windows x64下sizeof(long) = 4 (MSVC,x64),而其它x64平台使用gcc、clang得到的结果则是8。

    windows上的32位程序设计和64位程序设计最大的不同(亦ILP32和LLP64的不同),就在于指针的长度由32位变成了64位。Win32 API在很多情况下,都需要将整数转换成指针或者相反。在 32 位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在 64 位的硬件上却完全不一样。为此微软搞了个所谓的“多态类型”:对于特定的精度,可以使用固定精度的数据类型。不管处理器的词大小如何,它们的大小都是一致的。此外,当需要数据类型的精度随着处理器词大小变化时,可以使用指针精度数据类型,比如ULONG_PTR。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值