Решил я тут немного изучить Rust, чтобы не состариться, так и не вкусив плодов современной цивилизации.
Rust рекламируется как типобезопасный ЯП, и я подумал, что нужно это как-то проверить, увидеть, как говорится, своими глазами. На примере всяких диких, но вполне встречающихся конверсий типа из вещественного в целое. Тема важная, из-за подобных штук иногда ракеты падают, так что если ЯП заведомо типобезопасный, он должен такие ситуации корректно обрабатывать или бить по рукам, хотя бы в рантайме.
Почитав документацию:
The as keyword does safe casting
Набросал такой примерчик:
fn main() {
let a: f64 = std::f64::MAX; // данное значение просто пример "большого числа"
let b = a as i64;
println!("{}", b);
}
Вопросы:
1) С какой стати это вообще компилируется?
2) Да, f64 и i64 нужно одно и то же количество битов для хранения значения, ну и что?
3) Почему результат меняет знак?
Представьте, что какой-то тех. процесс идет, и определенный параметр нельзя изменять скачкообразно, иначе физически система (по крайней мере, один из компонентов) выйдет из строя (встанет в раскоряку, взорвется, выпустит токсичный газ, убивающий 100тыс. населения; нужное подчеркнуть). И вот значение в f64 положительное и увеличивается постепенно, с i64 все вроде в порядке (и тестирование проходит на тестовых значениях), и вдруг хренак! и уже -9223372036854775808
Как так?