Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1315999
  • 博文数量: 554
  • 博客积分: 10425
  • 博客等级: 上将
  • 技术积分: 7555
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-09 09:49
文章分类

全部博文(554)

文章存档

2012年(1)

2011年(1)

2009年(8)

2008年(544)

分类:

2008-04-11 16:27:29


运行的是哪种Solaris 操作环境?
第3 章• 比较32 位接口和64 位接口21
22
转换应用程序
对于应用程序开发者而言,需要面对以下两个有关转换的基本问题:
 不同数据模型之间的数据类型一致性
 使用不同数据模型的应用程序之间的互操作
尝试维护包含尽可能少的#ifdefs 的单一源代码通常比维护多个源代码树更好。本章将指导
您编写在32 位和64 位环境中均能够正常工作的代码。最理想的情况是,对当前代码的转换
只需重新编译以及重新链接到64 位的库。然而,还有需要更改代码的情况,本章讨论了有
助于使这类转换更容易的工具。
数据模型
如前所述,32 位环境和64 位环境之间最大的区别在于两种基础数据类型的变化。
用于32 位应用程序的C 数据类型模型是ILP32 模型,之所以这样命名,是因为类型int、
long 和指针均为32 位。LP64 数据模型是用于64 位应用程序的C 数据类型模型,业界公司
联盟已就此达成一致。之所以这样命名,是因为long 和指针类型的数据长度会增加到64
位。其余的C 类型int、short 和char 均与ILP32 模型中的相应类型相同。
以下的程序样例foo.c 直接对比说明了LP64 数据模型与ILP32 数据模型的不同结果。同一
个程序既可以编译为32 位程序,也可以编译为64 位程序。
#include
int
main(int argc, char *argv[])
{
(void) printf("char is \t\t%lu bytes\n", sizeof (char));
4第4 章
23
(void) printf("short is \t%lu bytes\n", sizeof (short));
(void) printf("int is \t\t%lu bytes\n", sizeof (int));
(void) printf("long is \t\t%lu bytes\n", sizeof (long));
(void) printf("long long is \t\t%lu bytes\n", sizeof (long long));
(void) printf("pointer is \t%lu bytes\n", sizeof (void *));
return (0);
}
32 位编译的结果是:
% cc -O -o foo32 foo.c
% foo32
char is 1 bytes
short is 2 bytes
int is 4 bytes
long is 4 bytes
long long is 8 bytes
pointer is 4 bytes
64 位编译的结果是:
% cc -xarch=generic64 -O -o foo64 foo.c
% foo64
char is 1 bytes
short is 2 bytes
int is 4 bytes
long is 8 bytes
long long is 8 bytes
pointer is 8 bytes
数据模型
24 Solaris(64 位)开发者指南• 2006 年11 月
注– 缺省编译环境旨在最大化可移植性,即创建32 位应用程序。
C 整型之间的标准关系仍然适用。
sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)
表4–1 列出了基本C 数据类型及其在LP32 和LP64 数据类型模型中的对应长度(以位为单
位)。
表4–1数据类型的长度(以位为单位)
C 数据类型ILP32 LP64
char 8 不变
short 16 不变
int 32 不变
long 32 64
long long 64 不变
pointer 32 64
enum 32 不变
float 32 不变
double 64 不变
long double 128 不变
某些旧的32 位应用程序可互换使用int、long 和指针类型。类型为long 的数据和指针长度
在LP64 数据模型中会增加。需要注意的是,单是这种变化就可导致许多32 位到64 位的转
换问题。
此外,声明和强制类型转换在说明意图时也会变得非常重要。类型更改时,表达式的求值
方式会受到影响。标准C 转换规则的作用受数据类型长度变化的影响。要充分说明意图,
可能需要声明常量的类型。为了确保按照预期的方式对表达式求值,可能还需要在表达式
中进行强制类型转换。对表达式进行正确的求值在符号扩展时尤其重要,在这种情况下进
行显式强制类型转换可能是实现预期效果所必需的。
对于内置的C 运算符、格式字符串、汇编语言以及兼容性和互操作性,还会出现其他问
题。
本章的其余部分将通过介绍以下内容来给出解决这些问题的建议:
 更详细地解释以上概述的问题
 介绍某些可用来使代码对于32 位和64 位均安全的派生类型和头文件
 介绍有助于使代码对于64 位安全的工具
数据模型
 
 
以上文章转自于 : http://developers.sun.com.cn/
阅读(543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~