水晶返回负数时使用..之间..两个积极
问题描述:
水晶奇怪地似乎输出负数。 我正在使用的代码是水晶返回负数时使用..之间..两个积极
(1..10000000000).each do |num|
if num % 10000000 == 0
if num < 0
puts "error #{num}"
exit
else
puts num
end
end
end
这只是它OUPUTS退出2140000000
然后error -2140000000
之前。这是为什么发生?
答
在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
这将工作!
答
的整数范围(1..10000000000)
,被包裹轮到负-2,147,483,648遇到2147483647后。
这是使用32位2的补码有符号整型类型时的常见行为。
答
我不知道crystal-lang,但很多语言在围绕最大值之前都有数字的最大值。也许它是围绕最大值进行说唱。
更好地使用Int64文字而不是调用'#to_i64':'(1_i64..10000000000_i64)'。该方法调用可能会通过LLVM进行优化,但这种方式更加清晰。 –