2016-09-21 8 views
0

サイズnの乱数の配列を作る関数を作っていますが、whileの比較ではエラーが発生します。 !の1、(+,::<、または>予想、{が見つかりました:と`usize`から` i32`へのキャストと他の方法との違いは何ですか?

while ar.len() as i32 < size { } 

は文句を言います。

as i32を削除した場合はmismatch typesと表示され、as usizeをサイズ変数に追加するとエラーにはなりません。

+0

優れたデザインは、おそらく最初の場所で 'size'タイプの' usize'を作ることであろう。 – starblue

答えて

3

小さいサイズのタイプから大きいサイズにキャストすると、データが失われることはありませんが、データの容量が増えます。

大きいサイズのタイプから小さいサイズにキャストすると、のデータが失われる可能性がありますが、データの容量は少なくなります。

は、私が9までの数字0を保持できる大きさの箱と私は番号を保存したい場合は99

に番号0を保持できる大きさの別のボックスを持っているふり7;両方のボックスが動作しますが、大きなボックスを使用するとスペースが残ってしまいます。小さい箱から大きい箱に何の問題もなく値を移すことができました。

番号42を保存する場合は、 1つのボックスだけがその番号に適合することができます。番号を取って小さなボックスで詰め込もうとすると、何かが失われます。通常は番号の上部にあります。この場合、私の42はに変換されます!おっとっと!

さらに、署名済みおよび署名なしが役割を果たします。符号付き2進数の場合、最上位ビットは数値の符号を示します。符号付きの数値と符号なしの数値の間でキャストすると、その値を誤って解釈している可能性があります。それは42のような数字が-48になることを意味するかもしれません!この特定場合


、それはもう少し複雑です。 A usizeは "ポインタサイズの整数"であることが定義されています。通常、これはマシンのネイティブサイズです。 64ビットx64プロセッサでは、usizeは64ビット、32ビットx86プロセッサでは32ビットとなります。

キャストするusizeからi32は、実行しているマシンのタイプによって異なります。あなたが試したコードが構文的に正しくないため


エラーメッセージあなたが得るであり、コンパイラが良いのエラーメッセージを与えていません。

は、あなたは本当に優先順位が適切に適用されるのに役立ちます

while (ar.len() as i32) < size { } 

かっこを入力します。安全のために

、私は大きな値にキャストしたい:

while ar.len() < size as usize { } 
+3

誰もがこれを指摘しているように見えるので、明確にする:問題は、コンパイラは*コードがパラメータ化された型を導入していると考えていることです。つまり、 'Vec 'のようなものですが、 '>'の代わりに '{'を見つけて混乱します。 *はい*、 'i32'はパラメータを持っていませんが、パーサはそのことを知らない*これは、そのような情報が分かる前に起こっていることです。 –

2

sizei32です。

while (ar.len() as i32) < size { } 

またはusizesizeをキャスト:

while ar.len() < size as usize { } 

len()として戻っusizeとの比較の両側の型が一致する必要がありますどちらかは、括弧を必要とします。 <演算子がi32sizeを比較しようとしないように、かっこが必要ですが、ar.len() as i32sizeのどちらかがあなたの意図です。

関連する問題