这可能是一个非常愚蠢的问题:
我们正在开发Solaris系统。
32位和64位的代码本身有什么不同吗? 或者更像是头文件的问题?
有人能给我一个64位的简单hello-username例子吗?
答案 0 :(得分:5)
这是一个64位程序:
#include <stdio.h>
int main(void)
{
puts("Hello world!");
return 0;
}
该程序作为32位程序也是安全的,并且作为16位程序也是安全的。程序不一定有任何差异,具体取决于编译的位数。
这是一个替代方案:
#include <limits.h>
#include <stdio.h>
int main(void)
{
printf("%ld\n", LONG_MAX);
return 0;
}
这将为32位系统和64位Unix系统提供不同的答案,但16位系统和64位Windows系统将产生与32位系统相同的答案。
请注意,这两个程序都具有相同的源代码,并使用相同的标头,无论它们是针对32位还是64位(或16位或8位/ {{3}进行编译} {&#39; s Grzegorz Szpetkowski)。其中一个程序具有不同的行为,具体取决于平台(编译器)以及是否针对32位或64位模式进行编译;另一个产生相同的输出。显然,根据编译模式,从标题派生的LONG_MAX
的值可能会有所不同。
答案 1 :(得分:2)
这是特定于编译器的。
如果您使用的是最近的GCC(Sparc或x86上),我猜您使用
gcc -m32 -Wall -g hello.c -o hello-32
和
gcc -m64 -Wall -g hello.c -o hello-64
将hello.c
编译成32位可执行文件hello-32
(相应的是64位可执行文件hello-64
)
您可以添加其他一些选项,例如-mtune=native -O2
作为Jonathan Leffler wisely answered,可以为32位或64位系统编译相同的程序。您应该确保行为合理。
您可能希望使用C99标准<stdint.h>
标头。使用最新的(GCC 4.9或更高版本)编译器,您可能希望使用-std=c11
编译器标志为C11编码。
避免将指针转换为整数类型或从整数类型转换指针。如果您绝对需要,请使用intptr_t
等...
答案 2 :(得分:1)
在C语言中,您只需要一个64位编译器和一个64位平台来运行代码。
在大多数情况下,您的实际源代码之间几乎没有区别,但有一些平台差异需要注意。不同的操作系统使用不同的64 bit data models;例如,在Win64中,long
仍然是32位,而Solaris long
变为64位。如果您的代码依赖于长32位,则需要修改该代码 - 在这种情况下,在任何情况下使用int32_t
或uint32_t
都会更安全。
SPARC64上的Solaris short
和char
以外的所有数据类型都变为64位,这可能需要小心移植现有代码。