将 int 类型转换为 uint8

Converting an int type to a uint8

Nim Tutorial page 状态:

Lossless Automatic type conversion is performed in expressions where different kinds of integer types are used.

所以,我认为在 uint8 的范围内创建一个 int 可以让我将它传递给 proc 期望 uint8uint8

但是,以下代码引发了带注释的错误:

import random

proc show(x: uint8) {.discardable.} = echo x

let a: int = 255
show(a)  # type mismatch: got (int) but expected one of proc show(x: uint8)

let b: uint8 = random(256)  # type mismatch: got (int) but expected 'uint8'
show(b)

我对第一个感到很困惑,它告诉我它需要一个 proc 而不是一个整数。第二个更清楚,但我预计此时会自动转换,因为 randomuint8 范围 (0..256) (documentation) 中生成 int

有没有办法将 int 转换为 uint8

random 过程定义为 return 和 int。在此示例中最大值为 256 的事实未在类型系统中编码(如果 randomstatic[int] 作为参数,则可能是)。

"lossless conversion" 表示较小整数类型的值可以转换为较大整数类型的值(例如从 int8int32)。在此处的示例中,您正尝试在另一个方向上执行转换。您可以通过显式转换来解决错误:

let a = uint8(rand(256))
show a
# or
let b = rand(256)
show uint32(b)

p.p。您不需要将 discardable 编译指示添加到没有 return 值的过程中。