在我的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位的结果。这是编译器问题吗?
答案 0 :(得分:9)
64位平台http://www.unix.org/version2/whatsnew/lp64_wp.html有多种编程模型,包括:
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)
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