用C写一个64位程序

时间:2014-11-16 15:52:07

标签: c 64-bit

这可能是一个非常愚蠢的问题:

  • 如何编写特别针对64位架构的程序。

我们正在开发Solaris系统。

32位和64位的代码本身有什么不同吗? 或者更像是头文件的问题?

有人能给我一个64位的简单hello-username例子吗?

3 个答案:

答案 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)

这是特定于编译器的。

如果您使用的是最近的GCCSparcx86上),我猜您使用

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_tuint32_t都会更安全。

SPARC64上的Solaris shortchar以外的所有数据类型都变为64位,这可能需要小心移植现有代码。

64 bit data models