使用时晶体返回负数.在两个积极因素之间

  • 本文关键字:两个 之间 返回 crystal-lang
  • 更新时间 :
  • 英文 :


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

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

相关内容

  • 没有找到相关文章

最新更新