Почему я не получаю ошибку литерала вне диапазона при сохранении числа, большего, чем i32, в переменную? - PullRequest
2 голосов
/ 20 апреля 2019

Документация Rust гласит, что целочисленный тип по умолчанию - i32, что означает, что наибольшее число, которое переменная может сохранить по умолчанию, - 2147483647, т.е. 2e31 - 1. Это также оказалось правдой: если я пытаюсь сохранить большее число, чем 2e31 - 1 в переменной x, я получаю ошибку literal out of range.

Код

fn main() {
    let x = 2147483647;
    println!("Maximum signed integer: {}", x);
    let x = 2e100;
    println!("x evalues to: {}", x);
}

но почему я не получаю ошибку, если я сохраняю значение 2e100 в переменной x? Это, безусловно, оценивается как больше чем 2e31 - 1.

выход

Maximum signed integer: 2147483647
x evalues to: 20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

код

fn main() {
    let x = 2147483648;
    println!("Maximum signed integer: {}", x);
}

выход

error: literal out of range for i32
 --> src/main.rs:2:11
  |
2 |     let x=2147483648;
  |           ^^^^^^^^^^
  |
  = note: #[deny(overflowing_literals)] on by default

1 Ответ

8 голосов
/ 20 апреля 2019

Литералы-константы, такие как 2e100, являются не целочисленными литералами, а литералами с плавающей запятой.Это может быть показано с помощью

fn main() {
    let () = 2e100;
}

, который выдает

error[E0308]: mismatched types
 --> src/main.rs:2:9
  |
2 |     let () = 2e100;
  |         ^^ expected floating-point number, found ()
  |
  = note: expected type `{float}`
             found type `()`

См. Также:

...