Oracle® Developer Studio 12.5:C 用户指南

退出打印视图

更新时间: 2016 年 7 月
 
 

8.1 数据模型差异概述

32 位和 64 位编译环境之间的最大差异是数据类型模型的更改。

32 位应用程序的 C 数据类型模型是 ILP32 模型,之所以这样命名是因为整型、长型和指针是 32 位数据类型。LP64 数据模型(之所以这样命名是因为长型和指针增长为 64 位)由业界各公司联合创建。其余 C 类型 intlong longshortchar 在这两种数据类型模型中相同。

无论数据类型模型如何,C 整型间的标准关系始终为真:

sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)

下表列出基本 C 数据类型及其对于 ILP32 和 LP64 数据模型的相应长度(位数)。

表 19  ILP32 和 LP64 的数据类型长度
C 数据类型
ILP32
LP64
char
8
8
short
16
16
int
32
32
long
32
64
long long
64
64
pointer
32
64
enum
32
32
float
32
32
double
64
64
long double
128
128

当前 32 位应用程序通常假设整型、指针和长型的长度相同。但是,长型和指针的长度在 LP64 数据模型中发生了更改,这会导致许多 ILP32 至 LP64 转换问题。

此外,声明和强制类型转换也非常重要。如果更改类型,计算表达式结果的方式会受到影响。标准 C 转换规则的效果受数据类型长度更改的影响。要充分表示您的意图,您需要显式声明常量的类型。您也可以在表达式中使用强制类型转换,以确保表达式按您想要的方式求值。特别是在进行符号扩展时,显式强制类型转换对说明意图至关重要,此时此做法更有必要。