Учитывая следующую программу:В чем разница между `cc -std = c99` и` c99` в Mac OS?
/* Find the sum of all the multiples of 3 or 5 below 1000. */
#include <stdio.h>
unsigned long int method_one(const unsigned long int n);
int
main(int argc, char *argv[])
{
unsigned long int sum = method_one(1000000000);
if (sum != 0) {
printf("Sum: %lu\n", sum);
} else {
printf("Error: Unsigned Integer Wrapping.\n");
}
return 0;
}
unsigned long int
method_one(const unsigned long int n)
{
unsigned long int i;
unsigned long int sum = 0;
for (i=1; i!=n; ++i) {
if (!(i % 3) || !(i % 5)) {
unsigned long int tmp_sum = sum;
sum += i;
if (sum < tmp_sum)
return 0;
}
}
return sum;
}
В системе Mac OS (Xcode 3.2.3), если я использую cc
для компиляции, используя -std=c99
флаг все кажется просто право:
nietzsche:problem_1 robert$ cc -std=c99 problem_1.c -o problem_1
nietzsche:problem_1 robert$ ./problem_1
Sum: 233333333166666668
Однако, если Я использую c99
скомпилировать это то, что происходит:
nietzsche:problem_1 robert$ c99 problem_1.c -o problem_1
nietzsche:problem_1 robert$ ./problem_1
Error: Unsigned Integer Wrapping.
Можете ли вы объяснить это поведение ?
Невозможно использовать 1000000 как пример, который показывает разницу и быстрее вычислять? ;) – kennytm
Вы пробовали выполнить код, скомпилированный с обоими компиляторами? Я полагаю, что 'unsigned long int' 32-бит в одном из компиляторов и 64-битных в другом. –
@KennyTM: Кажется, так, спасибо! –