【发布时间】:2021-02-21 11:18:36
【问题描述】:
unsigned long long m = 18446744073709551615ull;
unsigned long long i;
for (i=18446744073709551610ull; i<m; ++i) {
printf("%llu \n", i);
}
这会产生预期的结果: 18446744073709551610, 18446744073709551611, 18446744073709551612, 18446744073709551613, 18446744073709551614。
for (i=18446744073709551610ull; i<m+1; ++i) {
printf("%llu \n", i);
}
这根本不打印任何内容。
for (i=18446744073709551610ull; i<=m; ++i) {
printf("%llu \n", i);
}
这会打印无穷无尽的 6 位数字,每次运行程序时都从不同的数字开始,直到程序被取消。 我一直在打印 C 中所有可用的 Pell 数字,但希望程序在达到 C 中所有可用的 Pell 数字时停止。但是它会打印数百个六位数字,然后打印“分段错误(核心转储)”。这意味着在 C 中使用最大数时有四种不同的结果。这是 Pell 数代码:
unsigned long long x = 1, y = 2, z;
unsigned long long pell_series[52];
pell_series[0] = 0;
pell_series[1] = 1;
printf("%d,",0);
printf("%d,",1);
printf("%d,",2);
for (int q=2; q<m; q++) {
z = x + (y*2);
pell_series[q] = z;
printf("%llu,", z);
x = y;
y = z;
}
我知道 C 在使用最大数字时可能是不可预测的,但即使是不可预测性也是不可预测的。我的问题是 - 有没有办法让程序在达到最大可用数量时停止?
更新:
感谢您的所有回复,他们真的很有见地。我刚刚注意到我的 Pell 数代码中有一个巨大的错误:当然,代码应该只在 z 小于 m 时运行,而不是 q
【问题讨论】:
-
“我知道 C 在使用最大数字时可能是不可预测的” 无论是什么疯狂的方式将那些毫无价值的垃圾吸入你的知识库,别再听了。在您的平台上,
ULONG_LONG_MAX是18446744073709551615任何试图在 +1 处设计增量或表达式的任何尝试都将导致溢出(这是无符号的定义行为,但这对您并没有真正的帮助)。与其将基于超出限制的循环作为断点,不如考虑一个循环,其 tail 逻辑在实际达到限制时为break。 -
你为什么不打印
m呢?还是m+1? -
无符号数非常容易预测。
-
@IanStewart 仅次于 asm,C 和使用它的人一样“安全”,而且绝对不安全。允许你上吊是过分好战的,如果你试图上吊,它会毫不犹豫。 IE。它和你一样好。精通它,你就能做出惊人的事情。不这样做,你可以非常非常容易地非常做一些可怕的事情。