如何在OS X上强制进行64位整数运算?

时间:2009-04-28 21:25:01

标签: c gcc math macos

我试图在OS X 10.5.6上强制使用64位长整数。在Apple MacBook Intel Core 2 Duo上运行。这是我的c代码:

#include<stdio.h>

int main()
{
    long a = 2147483647; /*== 2^32 - 1*/
    long aplus1;

    printf("a== %d. sizeof(a) == %d  \n", a, sizeof(a));

    aplus1 = a+1;

    printf("aplus1 = %d \n", aplus1);
}

在没有任何开关的情况下进行编译会产生以下结果:

$ gcc testlong.c -o testlong ;./testlong

a== 2147483647. sizeof(a) == 4  
aplus1 = -2147483648 

使用-m64开关进行编译产生:

$ gcc testlong.c -o testlong -m64; ./testlong

a== 2147483647. sizeof(a) == 8  
aplus1 = -2147483648 

所以第二个版本显然是使用64位存储,但仍会产生溢出错误,尽管2 ^ 32应该在64位整数的范围内。有什么想法吗?

我更喜欢可以从gcc选项中强制使用的解决方案而不是要求我更改多行源代码(我的实际问题不是上面的例子,而是我需要在更一般的情况下强制执行长整数运算情况)。

5 个答案:

答案 0 :(得分:9)

您不仅需要使用long long,还必须相应地更改printf()语句。

#include<stdio.h>

int main()
{
    long long a = 2147483647; /*== 2^32 - 1*/
    long long aplus1;

    printf("a== %lld. sizeof(a) == %d  \n", a, sizeof(a));

    aplus1 = a+1;

    printf("aplus1 = %lld \n", aplus1);
}

%lld是long longs的代码。

显然,真正的64位程序可以将%d用于64位整数 - 我不知道是否可以将其配置为在此模式下编译。

答案 1 :(得分:3)

如果您使用的是C99,请添加stdint.h并使用uint64_tint64_t。除此之外,unsigned long long a = 0x100000000ull;也应该有用。

答案 2 :(得分:2)

使用C99标准:

#include <stdint.h>

uint64_t a = 2147483647ULL;

C99 library overview处有一个很棒的Dinkumware

答案 3 :(得分:0)

你试过了吗?

long long a = 2147483647;

答案 4 :(得分:0)

C代码中的文字2147483647属于int类型。如果您希望它是long,则左侧有long无效,右侧仍为int

通过附加'L'使其成为一个长文字:2147483647L(建议使用大写,小写'l'也适用,但根据字体可能会非常混乱)。