2017-04-13 26 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,但很多語言在圍繞最大值之前都有數字的最大值。也許它是圍繞最大值進行說唱。