有没有办法在没有溢出的文字警告的情况下获得带有二进制赋值的负数?

问题描述 投票:2回答:3

有没有办法在没有警告的情况下获得带有二进制赋值的负数,同时保留其他更有效的警告。或者我在考虑这个错误?

const NEG: i32 = 0b1000_0000_0000_0000_0000_0000_0000_0000;
// -2147483648    
warning: literal out of range for i32
 --> src/main.rs:1:18
  |
1 | const NEG: i32 = 0b1000_0000_0000_0000_0000_0000_0000_0000;
  |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: #[warn(overflowing_literals)] on by default
rust
3个回答
4
投票

您可以从无符号类型开始,然后转换为签名:

const NEG: i32 = 0b1000_0000_0000_0000_0000_0000_0000_0000_u32 as i32;

没有警告,同时保留其他更有效的警告

您可以禁用特定表达式的特定警告:

#[allow(overflowing_literals)]
const NEG: i32 = 0b1000_0000_0000_0000_0000_0000_0000_0000;

但是,这种原始行为似乎不正确。二进制值不在i32的范围之外。 An issue seems to exist


2
投票

你可以在它前面放置一个-

// warning
const N1: i32 = 0b1000_0000_0000_0000_0000_0000_0000_0000;

// no warning
const N2: i32 = -0b1000_0000_0000_0000_0000_0000_0000_0000;

assert_eq!(N1, N2);

Playground

但是,你的情况是一个特例,因为-N1 == N2。否则你必须否定一个结果(否则它会超级不直观)。


1
投票

或者我在考虑这个错误?

如果您想要的是最小和最大i32,那么MIN模块中已经有MAXstd::i32常量。它们更容易理解,你也不会犯错误。

use std::i32;

fn main() {
    const POS: i32 = i32::MAX;
    const NEG: i32 = i32::MIN;
    println!("{} {}", NEG, POS);
}
© www.soinside.com 2019 - 2024. All rights reserved.