我的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
答案 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 int
或long int
参数,或后续n转换 对应于指向c
参数的指针,或者后续wint_t
转换对应于s
参数,或后续wchar_t
转换对应于指向ll
的指针}参数。
long long int
(ell-ell)。以下整数转换对应于unsigned long long int
或n
参数或以下参数long long int
转换对应于指向a的指针z
论证。<强> ... 强>
size_t
以下整数转换对应于ssize_t
或199453*0 = 216319
参数。 (Linux libc5具有Z的含义。不要使用它。)
现在,例如此输出
printf
发生,因为小端64位数字199453,216319和43145473507被正确地推入堆栈;但是{{1}}期望在堆栈上只找到32位数字,因此它打印199453,0(这是64位数字199453的前4个字节)和216319。