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

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);

Playground

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

另一答案

或者我在考虑这个错误?

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

use std::i32;

fn main() {
    const POS: i32 = i32::MAX;
    const NEG: i32 = i32::MIN;
    println!("{} {}", NEG, POS);
}

以上是关于有没有办法在没有溢出的文字警告的情况下获得带有二进制赋值的负数?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在不使用画布 API 的情况下从图像文件中获取二进制数据?

如何防止弹性项目在没有包装的情况下溢出弹性父项?

有没有办法在不使用循环的情况下获得价值?

如何在没有固定高度的情况下使动态div溢出

有没有办法在没有信箱的情况下获得高分辨率的 YouTube 视频缩略图?

有没有办法在没有投影的情况下在春季数据休息中返回带有 id 的关联对象