【问题标题】:How do I force 64 bit integer arithmetic on OS X?如何在 OS X 上强制 64 位整数运算?
【发布时间】:2009-04-28 21:25:01
【问题描述】:

我试图在 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 选项强制执行的解决方案,而不是要求我更改多行源代码(我的实际问题不是具体的上述示例,而是我需要在更通用的情况下强制长整数运算情况)。

【问题讨论】:

    标签: c gcc math macos


    【解决方案1】:

    不仅要使用 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 long 的代码。

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

    【讨论】:

    • 确实,printf 格式规范是问题所在。如果 OP 的系统具有 32 位整数和 64 位长整数,则不需要 long long - 只需将格式更改为“%ld”就足够了。
    • 好吧,ehemient 是完全正确的。看来我的原始代码中的问题出在 printf 语句中——只要我使用 -m64 开关进行编译,更改为 %ld 即可解决问题而无需“long long”。谢谢!
    • Mac OS X 64位遵循LP64模型,即(int=32,long=longlong=pointer=64);这是最常见的 64 位模型。 Win64 使用 LLP64(int=long=32,longlong=pointer=64)。 ICC 接受 -DMKL_ILP64 遵循 ILP64 模型 (int=long=longlong=pointer=64),而 GCC 也有 -mint64,但它在大多数平台上不可用,并且破坏了与其他库和系统 API 的兼容性。
    【解决方案2】:

    如果您使用 C99,请包含 stdint.h 并使用 uint64_tint64_t。除此之外,unsigned long long a = 0x100000000ull; 也应该可以工作。

    【讨论】:

    • 我支持这个。要打印,您可以使用 stdint.h printf("a = %"PRIu64"\n"); 中定义的“PRI”宏
    【解决方案3】:

    使用 C99 标准:

    #include <stdint.h>
    
    uint64_t a = 2147483647ULL;
    

    Dinkumware 上有一个出色的 C99 library overview

    【讨论】:

      【解决方案4】:

      你试过了吗:

      long long a = 2147483647;
      

      【讨论】:

      • 感谢您的及时回复!但是,无论有没有 -m64 开关,这似乎都不起作用。
      【解决方案5】:

      C 代码中的文字2147483647 的类型为int。如果您希望它是 long,那么在左侧使用 long 并没有帮助,在右侧仍然是 int

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

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 1970-01-01
        • 2011-01-29
        • 2013-03-22
        • 1970-01-01
        • 2012-11-01
        • 2010-12-04
        • 2014-07-25
        • 1970-01-01
        相关资源
        最近更新 更多