JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

1.  C 编译器介绍

2.  特定于 C 编译器实现的信息

3.  并行化 C 代码

4.  lint 源代码检验器

5.  基于类型的别名分析

6.  转换为 ISO C

7.  转换应用程序以适用于 64 位环境

7.1 数据模型差异概述

7.2 实现单一源代码

7.2.1 派生类型

7.2.1.1 <sys/types.h>

7.2.1.2 <inttypes.h>

定宽整型

诸如 unintptr_t 的有用类型

常量宏

限制

格式字符串宏

7.2.2 使用 lint 检查

7.3 转换为 LP64 数据类型模型

7.3.1 整型和指针长度更改

7.3.2 整型和长型长度更改

7.3.3 符号扩展

7.3.4 指针运算而不是整数

7.3.5 结构

7.3.6 联合

7.3.7 类型常量

7.3.8 注意隐式声明

7.3.9 sizeof( ) 是无符号 long

7.3.10 使用强制类型转换显示您的意图

7.3.11 检查格式字符串转换操作

7.4 其他转换注意事项

7.4.1 注意:长度增长的派生类型

7.4.2 检查更改的副作用

7.4.3 检查直接使用 long 是否仍有意义

7.4.4 对显式 32 位与 64 位原型使用 #ifdef

7.4.5 调用转换更改

7.4.6 算法更改

7.5 入门指导核对表

8.  cscope:交互检查 C 程序

A.  按功能分组的编译器选项

B.  C 编译器选项参考

C.  实现定义的 ISO/IEC C99 行为

D.  C99 的功能

E.  实现定义的 ISO/IEC C90 行为

F.  ISO C 数据表示法

G.  性能调节

H.  Oracle Solaris Studio C:K&R C 与 ISO 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 数据类型
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 转换规则的效果受数据类型长度更改的影响。要充分表示您的意图,您需要显式声明常量的类型。您也可以在表达式中使用强制类型转换,以确保表达式按您想要的方式求值。特别是在进行符号扩展时,显式强制类型转换对说明意图至关重要,此时此做法更有必要。