奇怪的是,水晶似乎输出负数。我使用的代码是
(1..10000000000).each do |num|
if num % 10000000 == 0
if num < 0
puts "error #{num}"
exit
else
puts num
end
end
end
这在它退出之前输出 2140000000
然后error -2140000000
.为什么会这样?
(1..10000000000)
范围内的整数在遇到 2,147,483,647 后四舍五入为负 -2,147,483,648。
这是使用 32 位 2 的补码有符号整数类型时的常见行为。
在 Crystal 中,默认情况下整数的类型为 Int32,因此当您定义 Range(Int32, Int64( (1..10000000000)
时,它不能从 Int32 变为 Int64。它将在最大 Int32 数字 ( 2147483647
( 中添加符号咬合并使用负数。
因此,如果您要运行下一个代码:
max_32 = 2147483647
already_64 = 2147483649
(max_32..already_64).each do |num|
puts num
end
它永远不会停止(((
puts 2147483647 + 1 # -2147483648
在您的情况下,您必须定义范围的类型:
(1.to_i64..10000000000.to_i64).each do |num|
....... your next code
那会起作用!
我不知道 crystal-lang,但很多语言在数字圆圈到 -最大值之前都有一个最大值。 也许它正在围绕最大值说唱。