我的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
,%lld
是long long int
,并且由于使用的是unsigned long long
,因此应使用%llu
,否则大的正值将显示为负数。
并且,正如Grzegorz Szpetkowski所注意到的,size_t
(sizeof
)需要%zu
。
从printf(3):
l
(ell)以下整数转换对应于long 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
以下整数转换对应于size_t
或ssize_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/