Есть ли способ получить абсолютное значение u32 i32, что делает правильную вещь для std :: i32 :: MIN? - PullRequest
0 голосов
/ 20 сентября 2019

Этот вопрос и его ответ описывают, почему abs () на i32 возвращает i32, а не u32.В нем говорится «похоже, что принятый обходной путь - использовать as u32 для приведения».Однако это приведет к панике в режиме отладки, если аргумент std::i32::MIN.Есть ли способ в стандартной библиотеке получить правильное значение, или я должен написать свою собственную реализацию с особым случаем для этого значения - что-то вроде этого:

fn my_abs(x: i32) -> u32 {
  if x == std::i32::MIN {
    (-(x as i64)) as u32
  } else {
    x.abs() as u32
  }
}

1 Ответ

3 голосов
/ 20 сентября 2019

Я только что понял, что x.wrapping_abs() as u32 делает то, что я хочу: все числа, кроме std::i32::MIN, сопоставляются с их абсолютным значением сначала как i32, затем приводятся к u32, и std::i32::MIN остается тем же, но затем приводится кU32 случается, чтобы превратить его в абсолютное значение.Это работает и для других битов ширины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...