【发布时间】:2020-06-10 19:52:17
【问题描述】:
以下代码在给出大于的数字时失败 111111111111111111(19次1)。
虽然 unsigned long long int 应该最多容纳 18446744073709551615(19 个数字),但是 111111111111111111(19 乘以 1)失败
#include <stdio.h>
#include <stdlib.h>
// included for sleep test after num printf
#include <unistd.h>
#include <limits.h>
#define MAX 2000000
unsigned long long int num;
unsigned long long int main(){
for(;;){
char buf[MAX];
printf(" : %llu\n", (unsigned long long int) ULONG_MAX);
printf("enter max number : ");
fgets(buf, MAX, stdin);
num = strtoull(buf,NULL,10);
printf("num holds number : %lld\n",num);
printf("ULONG_MAX : %lld\n\n\n\n", (unsigned long long int) ULLONG_MAX);
}
return num;
}
使用 19 次 1,我得到 --
num holds number : -7335632962598440505
-- 但它仍然在 unsigned long long int...??!?!?!?!
我也不明白为什么这条线不起作用
printf("ULONG_MAX : %lld\n\n\n\n", (unsigned long long int) ULLONG_MAX);
这个命令已经失败,输入 1 并给出 -1。(我猜是返回错误?)
感谢您的帮助
【问题讨论】:
-
您不能使用
unsigned long long来返回main()。它总是返回int。 -
%lld是 signed long long,使用%llu表示未签名。 -
%lld用于long long。对于unsigned long long,请使用%llu。 -
同意上面的
%llu。具体来说,man 3 printf并查找“转换说明符”。 -
为什么要使用 200 万字符缓冲区来存储无符号长整数?比方说,100 不是绰绰有余吗?
标签: c linux gcc long-integer unsigned