Sun Studio 12:C 用户指南

7.1 数据模型差异概述

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

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

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

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

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

表 7–1 ILP32 和 LP64 的数据类型长度

C 数据类型 

LP32 

LP64 

char

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 转换规则的效果受数据类型长度更改的影响。要充分表示您的意图,您需要显式声明常量的类型。您也可以在表达式中使用强制类型转换,以确保表达式按您想要的方式求值。特别是在符号扩展的情况下,显式强制类型转换对说明意图至关重要,此时这样做更有必要。