2014-11-01 47 views
2

我想使用一个位移,但我需要结果作为一个F64。我似乎无法想象如何转变,并让结果作为f64而不会形成丑陋的tmp。在生锈我怎么能做这种类型转换在一行

let num_bits: uint = 32; // just for reference 

// how can these two lines be 1 line 
let muli: int = 1<<(num_bits-2); 
let mul: f64 = muli as f64; 

我怎么能写的最后两行中的一行,所以我不需要muli

我在主题尝试做了各种尝试:

let m: f64 = 1<<(num_bits-2) as f64; 

这给playpen

<anon>:8:21: 8:40 error: mismatched types: expected `uint`, found `f64` (expected uint, found f64) 
    <anon>:8  let m: f64 = 1<<(num_bits-2) as f64; 

回答

4

你可以通过注释1文字的类型来做到这一点。我假设你想让它的结果为int(在转换为f64之前),因为你说的是​​multi: int。否则,你想要1u

let m: f64 = (1i << (num_bits - 2)) as f64; 

检查playpen

+0

谢谢你的回答。是否有'num_bits'的值,其中'1u'和'1i'会给出'm'的不同结果? – Victory 2014-11-01 23:50:09

+0

如果它只是一个正在转移的'1',则不会。无论如何,如果这个问题是你的实际代码的一般形式,可能不会改变'1'。 – 2014-11-02 03:10:23

+1

@Victory:要注意Rust,int和uint的位数因平台而异。如果你想要一个64位的整数,那么你应该使用'i64'或'u64'。 – 2014-11-03 07:47:48

3

如果你看一下生锈的参考,你可以看到as操作的优先级高于<<所以你必须这样做:

fn main() { 
    let num_bits: uint = 32; // just for reference 
    let m: f64 = (1u << num_bits - 2) as f64; 
    println!("mul {}", mul); 
} 

您还必须指定1的字节作为uint1u),因为编译器在写入时无法从上下文中剔除它的类型。

+0

谢谢你的回答,这对另一个人来说同样好,但是,Jorge's早了,所以我必须接受他。我仍然+1你的。如果您有兴趣寻找,我还会在其他答案中提出一个问题。 – Victory 2014-11-01 23:51:53

相关问题