迭代u8的所有值时,字面超出范围警告

时间:2016-11-04 11:15:27

标签: rust

根据我的理解,for - 循环中的范围是低限制包含和上限排除。这在以下代码中引入了一个问题:

fn main() {
    let a: u8 = 4;

    for num in 0..256 {
        if num == a {
            println!("match found");
            break;
        }
    }
}

我想从0到255循环256次,这符合u8支持的数据范围。但由于范围是上限独占,我必须给256作为处理255的限制。因此,编译器给出以下警告。

warning: literal out of range for u8
 --> src/main.rs:4:19
  |
4 |     for num in 0..256 {
  |                   ^^^
  |
  = note: #[warn(overflowing_literals)] on by default

执行此操作时,程序会跳过for循环。

在我看来,编译器必须忽略范围内的256并接受范围为u8范围。这是对的吗?还有其他方法可以给出范围吗?

3 个答案:

答案 0 :(得分:4)

正如亚历克斯已经说过的,最好使用更大的整数类型(如u32)进行迭代,并在与您搜索的u8进行比较时进行投射:

let a: u8 = 4;

for num in 0..256 {
    if (num as u8) == a {
        println!("match found");
        break;
    }
}

在这种特殊情况下,您也可以使用a half-open range

let a: u8 = 4;

for num in 0.. {
    if num == a {
        println!("match found");
        break;
    }
}
  

当我执行此操作时,程序会跳过for循环。

256的二进制表示是1_0000_0000u8仅保存最右边的8位,因此仅0 s。因此0..256u8相当于0..0,当然这是一个空范围。

答案 1 :(得分:4)

您可以组合迭代器来创建完整的u8范围:

use std::iter::once;
for i in (0..255).chain(once(255)){
    //...
}

在夜间Rust中,您可以使用inclusive range

#![feature(inclusive_range_syntax)]
for i in 0...255 {
    //...
}

答案 2 :(得分:0)

我认为你正在比较不同的类型,所以需要施展。试试这个:

for num in 0..256 {
    let y = num as u8;
    if y == a {
        println!("found");
        break;
    }
}