Solaris 10上的64位与32位C代码

时间:2010-10-09 03:16:58

标签: c solaris

在我的Solaris 10 update 9系统上,以下命令产生:

#isainfo -b
64 

但如果我在C中用limits.h创建以下程序,我会得到:

#include <stdio.h>
#include <limits.h>

int main(void)
{ 
     printf("Maximum integer value on this system is = %d\n", INT_MAX);
}
gcc on64.c -o on64
./on64

Maximum integer value on this system is = 2147483647

我期待更大的结果,因为系统运行在64位。这似乎是一个32位的结果。这是编译器问题吗?

7 个答案:

答案 0 :(得分:9)

64位平台http://www.unix.org/version2/whatsnew/lp64_wp.html有多种编程模型,包括:

  • ILP64(其中int,long和指针是64位)
  • LP64(其中int是32位,而long是长度,指针是64位)

64位Solaris 10使用LP64模型(http://www.sun.com/software/solaris/faqs/64bit.xml#q4):

  问:什么是用于的数据模型   Solaris操作系统?

     

答:LP64是事实上的行业   标准。 L代表长而且   P代表指针。两者都是   64位,而int是32位。

除了“64位编程模型:为何选择LP64?”上面引用的论文,您可能想看看Raymond Chen对Win64选择LLP64模型的原因的解释,因为它可能有助于支持unix.org文档中的各种基本原理和参数:http://blogs.msdn.com/b/oldnewthing/archive/2005/01/31/363790.aspx

答案 1 :(得分:5)

无论平台如何,gcc上的“int”类型都是32位。 “long”类型在32位平台上为32位,在64位平台上为64位。

为了减少歧义,你可以使用C99类型:

#include <stdint.h>

int32_t i32;
int64_t i64;

答案 2 :(得分:1)

来自gcc documentation

  

64位环境将int设置为32   位和long以及指向64位的指针   并为AMD的x86-64生成代码   架构。

答案 3 :(得分:1)

如果你想要最大整数类型的大小,那就是intmax_t

#include <stdio.h>
#include <stdint.h>

int main(void)
{ 
     printf("Maximum integer value on this system is = %jd\n", INTMAX_MAX);
}

这将始终至少为2 ^ 63 - 1。

答案 4 :(得分:1)

您可以在Solaris 10上编译32位或64位程序。默认情况下,它们是32位编译的。

使用GCC和更新的Sun编译器,选项“-m32”和“-m64”指示使用哪个选项。因此,请尝试:

$ gcc -m64 -o on64-64 on64.c
$ gcc -m32 -o on64-32 on64.c

然后运行:

$ file on64 on64-32 on64-64
...take a look see...
$ ./on64-64
...take a look see...
$ ./on64-32
...as you originally found...
$

答案 5 :(得分:0)

首先,您必须确保以64位模式运行编译器。有些编译器默认使用32位目标平台模式,即使它们能够生成64位代码。

其次,一些编译器更喜欢64位类型模型,其中类型int仍然是32位。 GCC实际上就是其中之一。因此,您对int类型在64位模式下成为64位类型的期望是完全没有根据的。

同样,一切都取决于编译器,仅取决于编译器(以及编译器设置)。你对你的操作系统做了什么是完全无关紧要的。您可以将Solaris更新为237位或1001位版本,但GCC将继续生成32位代码,直到更改GCC默认值或直到您明确请求其他目标平台。

答案 6 :(得分:0)

如果你想看到“long”类型(在32位架构上是32位,在64位架构上是64位,而不是“int”,总是32位),你可以打印:

printf("max long = %ld", LONG_MAX);

在使用'-m64'

编译时给了我这个
Max long on this system is: 9223372036854775807

以及使用'-m32'

编译时的情况
Max long on this system is: 2147483647