有没有办法在没有警告的情况下获得带有二进制赋值的负数,同时保留其他更有效的警告。或者我在考虑这个错误?
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
答案 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);
但是,您的案例是一个特例,因为-N1 == N2
。否则你必须否定一个结果(否则它会超级不直观)。