有没有办法在没有溢出的文字警告的情况下获得带有二进制赋值的负数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有办法在没有溢出的文字警告的情况下获得带有二进制赋值的负数?相关的知识,希望对你有一定的参考价值。
有没有办法在没有警告的情况下获得带有二进制赋值的负数,同时保留其他更有效的警告。或者我在考虑这个错误?
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
答案
您可以从无符号类型开始,然后转换为签名:
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。
另一答案
你可以在它前面放置一个-
:
// 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
。否则你必须否定一个结果(否则它会超级不直观)。
另一答案
或者我在考虑这个错误?
如果您想要的是最小和最大i32
,那么MIN
模块中已经有MAX
和std::i32
常量。它们更容易理解,你也不会犯错误。
use std::i32;
fn main() {
const POS: i32 = i32::MAX;
const NEG: i32 = i32::MIN;
println!("{} {}", NEG, POS);
}
以上是关于有没有办法在没有溢出的文字警告的情况下获得带有二进制赋值的负数?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?