2017-04-13 24 views
2

水晶奇怪地似乎输出负数。 我正在使用的代码是水晶返回负数时使用..之间..两个积极

(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之前。这是为什么发生?

回答

0

在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 

这将工作!

+0

更好地使用Int64文字而不是调用'#to_i64':'(1_i64..10000000000_i64)'。该方法调用可能会通过LLVM进行优化,但这种方式更加清晰。 –

3

整数范围(1..10000000000),被包裹轮到负-2,147,483,648遇到2147483647后。

这是使用32位2的补码有符号整型类型时的常见行为。

0

我不知道crystal-lang,但很多语言在围绕最大值之前都有数字的最大值。也许它是围绕最大值进行说唱。