我的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)
你的printf格式字符串是错误的.%ld需要a long int,%lld用于a long long int,并且因为你正在使用unsigned long long,你应该使用%llu,否则大的正值将显示为负数.
并且,正如Grzegorz Szpetkowski所注意到的,size_t(sizeof)需要%zu.
来自printf(3):
l(ell)以下整数转换对应于along int或unsigned long int参数,或者后续n转换对应于指向long int参数的指针,或者后续c转换对应于wint_t参数,或者后续s转换对应于指向wchar_t参数的指针.
ll(ELL-ELL).以下整数转换对应于long long int或unsigned long long int参数,或者后续n转换对应于指向long long int参数的指针 ....
z以下整数转换对应于asize_t或ssize_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.