C中的长长乘法给出了错误的结果

时间:2015-01-22 22:13:31

标签: c gcc

我的C代码似乎出现故障,无法将长长的数字乘以输出结果,我不能为我的生活找出原因。

这是罪魁祸首代码:

#include "stdio.h"

int main()
{
  unsigned long long primes[] = {199453LL, 200723LL, 203317LL, 205103LL, 206603LL, 208057LL, 210323LL, 210961LL, 212827LL, 214237LL, 215693LL, 216319LL};
  unsigned long long numbers[6];

  int i;
  printf("Calculating the numbers to factor!\n");
  printf("Size of long: %i\n", sizeof(long));
  printf("Size of long long: %i\n", sizeof(long long));
  for (i = 0; i < 6; i++)
  {
    numbers[i] = primes[i]*primes[11-i];
    printf("%ld*%ld = %ld\n", primes[i], primes[11-i], numbers[i]);
    printf("Result is %ld\n",numbers[i]);
  }

  return 0;
}

这是我编译并运行它时的输出(我在Linux上使用gcc版本4.8.2)

Calculating the numbers to factor!
Size of long: 4
Size of long long: 8
199453*0 = 216319
Result is 195800547
200723*0 = 215693
Result is 344873079
203317*0 = 214237
Result is 608351169
205103*0 = 212827
Result is 701783221
206603*0 = 210961
Result is 635502523
208057*0 = 210323
Result is 809499451

1 个答案:

答案 0 :(得分:7)

您的printf格式字符串错误。 %ld需要long int%lld适用于long long int,并且由于您使用的是unsigned long long,因此您应使用%llu,否则请使用size_t值将显示为负数。

而且,正如Grzegorz Szpetkowski所注意到的,sizeof%zu)需要l

来自 printf(3)

  

long int(ell)以下整数转换对应于unsigned long intlong int参数,或后续n转换   对应于指向c参数的指针,或者后续wint_t转换对应于s参数,或后续wchar_t转换对应于指向ll的指针}参数。

     

long long int(ell-ell)。以下整数转换对应于unsigned long long intn参数或以下参数   long long int转换对应于指向a的指针                 z论证。

     

<强> ...

     

size_t以下整数转换对应于ssize_t199453*0 = 216319 参数。 (Linux libc5具有Z的含义。不要使用它。)


现在,例如此输出

printf

发生,因为小端64位数字199453,216319和43145473507被正确地推入堆栈;但是{{1}}期望在堆栈上只找到32位数字,因此它打印199453,0(这是64位数字199453的前4个字节)和216319。