我的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

最佳答案

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

并且,正如Grzegorz Szpetkowski所注意到的,size_tsizeof)需要%zu

从printf(3):


  l(ell)以下整数转换对应于long intunsigned long int参数,或以下n转换
  对应于指向long int参数的指针,或者随后的c转换对应于wint_t参数,或者随后的s转换对应于指向wchar_t参数的指针。
  
  ll(ell-ell)。以下整数转换对应于long long intunsigned long long int参数,或以下
  n转换对应于指向
                long long int参数。
  
  ...
  
  z以下整数转换对应于size_tssize_t参数。 (Linux libc5具有Z的含义。请勿使用。)




现在,例如此输出

199453*0 = 216319


发生是因为小尾数64位数字199453、216319和43145473507被正确推入堆栈;但是printf期望仅在堆栈中找到32位数字,因此它将输出199453、0(这是64位数字199453的前4个字节)和216319。

关于c - C中的long long乘法给出错误结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28099645/

10-16 17:27