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

kje*_*ins -1 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我编译并运行它时的输出(我在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
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 7

你的printf格式字符串是错误的.%ld需要a long int,%lld用于a long long int,并且因为你正在使用unsigned long long,你应该使用%llu,否则大的正值将显示为负数.

并且,正如Grzegorz Szpetkowski所注意到的,size_t(sizeof)需要%zu.

来自printf(3):

l (ell)以下整数转换对应于a 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 以下整数转换对应于a size_tssize_t参数.(Linux libc5有Z的意思.不要使用它.)


现在,例如这个输出

199453*0 = 216319
Run Code Online (Sandbox Code Playgroud)

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

  • 除了这个`sizeof`运算符,还会产生类型`size_t`的值.正确的格式说明符是`%zu`. (3认同)