有没有办法在没有overflowing_literals警告的情况下通过二进制赋值获得负数?

时间:2018-03-02 22:56:53

标签: rust

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。否则你必须否定一个结果(否则它会超级不直观)。