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
那行得通!
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
那行得通!