2014-08-28 86 views
-1
#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); 
} 


为什么两个size_t的乘积是错的?

$ 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(锵)编译器产生正确的结果。但是我在多个平台上使用gcc/gfortran。

+0

你为什么认为这是错的? – RegularExpression 2014-08-28 05:14:46

+0

http://stackoverflow.com/questions/25402815/output-of-large-numbers这似乎相关 – pragnesh 2014-08-28 05:19:20

+0

'size_t'的正确格式是'“%zu”'。 – 2014-08-28 07:43:32

回答

2

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

6亿* 8是4800000000. 2^32是4294967296

由于为size_t是一个32位的系统上的4个字节,假定它是无符号的,并且占溢出,我们得到:

48亿 - 4294967296,这是505032704.

你应该能够找到一个64位编译器(它似乎是本机cc Clang编译器),但是最好使用专门的64位类型(而不是size_t )。

+0

好的,谢谢。我可以看到32位截断正在发生,但我错误地认为我的编译器会使size_t为64位。解决这个问题的办法比找到一个新的编译器要简单得多(尽管这可能是时候)。我只使用-m64选项,它可以正常工作。 – user2958908 2014-08-28 22:07:28

+0

很高兴你发现一个简单的修复。 – 2014-08-29 00:08:59