为什么两个size_t的错误是多少?

时间:2014-08-28 05:05:04

标签: macos gcc

#include <stdio.h>

int main ()
{
    size_t foo = 600000000;
    size_t bar = 8;
    size_t foobar = foo * bar;
    printf ("%lu * %lu is %lu\n",foo,bar,foobar);
}


$ gcc -o hello hello.c
$ ./hello
600000000 * 8 is 505032704
$ gcc --version
gcc (GCC) 4.4.1 20090623 (prerelease)

Mac OS X 10.7.5

原生cc(Clang)编译器产生正确的结果。但我在多个平台上使用gcc / gfortran。

1 个答案:

答案 0 :(得分:2)

你有一个溢出问题。您的问题是您的编译器正在创建32位代码。

600000000 * 8是4800000000。 2 ^ 32是4294967296。

由于size_t在32位系统上是4个字节,假设它是无符号的,并且考虑到溢出,我们得到:

4800000000 - 4294967296,即505032704。

你应该能够找到64位编译器(它似乎是原生的cc Clang编译器),但你最好使用特定的64位类型(而不是size_t)。