为什么不能比较两个不同类型的整数?

Mil*_*k27 3 comparison rust

let x: i32 = 4;
let y: i16 = 4;

println!("{}", x == y);
Run Code Online (Sandbox Code Playgroud)

编译上面的代码片段时,编译器将显示以下错误:

let x: i32 = 4;
let y: i16 = 4;

println!("{}", x == y);
Run Code Online (Sandbox Code Playgroud)

似乎PartialEq没有为不同类型的整数实现。f32f64,和之间也发生相同的情况PartialOrd。有什么理由吗?是否打算在Rust的未来版本中实现?

lje*_*drz 5

这是预期的行为 - Rust 是一种强类型语言,它不会在不同类型的整数之间执行隐式转换。

我认为这在未来不会改变,因为这将成为众所周知难以找到的错误的潜在来源。

您需要明确并注意数字转换(截断等)的潜在警告

let x: i32 = 4;
let y: i16 = 4;

println!("{}", x == y as i32);
Run Code Online (Sandbox Code Playgroud)

  • @Milack27:为了比较值,比较实现*将*必须执行强制转换。在 CPU 级别,两个整数只有在具有相同的位宽时才能进行比较,并且只有在两者都是有符号的或都是无符号的情况下,才能对位进行比较。实施一次不太容易出错,但它会发生。 (2认同)

Mat*_* M. 5

Rust中有很多整数类型:

  • i8i16i32i64i128
  • u8u16u32u64u128
  • isize
  • usize

在某些情况下,混合算术或比较将具有明显的实现方式,因为可以在一个方向上进行无损转换:

  • i<x>可以始终转换为i<y>if x < y
  • u<x>可以始终转换为u<y>if x < y
  • u<x>可以始终转换为i<y>if x < y

但是,某些转换并不明显或无法移植:

  • i<x>u<y>无论xand y分别是什么值,都无法转换为
  • isize并且usize在任何地方都有特定于平台的大小,可小至16位,大至64位。

因此,由于Rust并不热衷于上溢或下溢,因此不太可能实施任意混合算术或比较。

可以实现一个受限制的子集,但随后提出了两个问题:

  • 受限子集不是人体工程学的吗?
  • 使用混合类型不是设计问题的标志吗?同样,数量应该具有单位,数量可能应该具有已知的大小

  • @ Milack27这也取决于您所说的“全面支持”。您如何将“ i64”与“ u64”进行比较?在C ++中,这样的比较(尽管不是UB)在某些情况下只会产生意想不到的结果。并非所有人都对编译器引入一些仅用于整数比较的复杂逻辑感到满意。 (3认同)
  • @E_net4 我认为在“i64”和“u64”之间提供比较逻辑比强迫程序员使用强制转换并产生意外结果更好,就像在 C++ 中发生的那样。但如果你对开销不满意,无论如何你都可以使用演员表。 (3认同)