Crystal return 在两个正数之间使用 .. 时为负数

Crystal return negative number when using .. between two positives

Crystal 奇怪的是似乎输出负数。 我使用的代码是

(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-lang,但很多语言在数字循环到 -maximum 值之前都有一个最大值。也许它正在围绕最大值说唱。

in 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

那行得通!