尝试进行位移时崩溃
Crash while trying to do bit shift
我正在尝试运行这个防锈代码
use std::net::Ipv4Addr;
fn ip_to_int(addr: Ipv4Addr) -> u32 {
let ip = addr.octets();
(ip[0] as u32) << 24 + (ip[1] as u32) << 16 + (ip[2] as u32) << 8 + (ip[3] as u32)
}
fn main() {
let ip = Ipv4Addr::new(74, 125, 227, 0);
println!("{}", ip_to_int(ip));
}
这会崩溃
thread '<main>' panicked at 'shift operation overflowed', test.rs:5
我确实将所有内容都转换为 32 位整数,并且没有任何移位大于 32 位。为什么会崩溃?另外,编译器不应该捕捉到这个并阻止编译吗?
Abhishek@Abhisheks-MacBook-Pro-2:~$ rustc --version
rustc 1.1.0-nightly (21f278a68 2015-04-23) (built 2015-04-24)
根据 the Rust reference,运算符 +
的优先级高于运算符 <<
,这意味着您的表达式实际上是这样解析的:
(ip[0] as u32) << (24 + (ip[1] as u32)) << (16 + (ip[2] as u32)) << (8 + (ip[3] as u32))
这很容易溢出。
您需要添加合适的括号:
((ip[0] as u32) << 24) + ((ip[1] as u32) << 16) + ((ip[2] as u32) << 8) + (ip[3] as u32)
我正在尝试运行这个防锈代码
use std::net::Ipv4Addr;
fn ip_to_int(addr: Ipv4Addr) -> u32 {
let ip = addr.octets();
(ip[0] as u32) << 24 + (ip[1] as u32) << 16 + (ip[2] as u32) << 8 + (ip[3] as u32)
}
fn main() {
let ip = Ipv4Addr::new(74, 125, 227, 0);
println!("{}", ip_to_int(ip));
}
这会崩溃
thread '<main>' panicked at 'shift operation overflowed', test.rs:5
我确实将所有内容都转换为 32 位整数,并且没有任何移位大于 32 位。为什么会崩溃?另外,编译器不应该捕捉到这个并阻止编译吗?
Abhishek@Abhisheks-MacBook-Pro-2:~$ rustc --version
rustc 1.1.0-nightly (21f278a68 2015-04-23) (built 2015-04-24)
根据 the Rust reference,运算符 +
的优先级高于运算符 <<
,这意味着您的表达式实际上是这样解析的:
(ip[0] as u32) << (24 + (ip[1] as u32)) << (16 + (ip[2] as u32)) << (8 + (ip[3] as u32))
这很容易溢出。
您需要添加合适的括号:
((ip[0] as u32) << 24) + ((ip[1] as u32) << 16) + ((ip[2] as u32) << 8) + (ip[3] as u32)