2017-01-24 7 views
-1

と仮定、あなたはどのようにして負数をより広い型に変換するのですか?

short num = -10; 
int num_casted = (int)num; 
std::cout << num_casted << endl; // prints -10. 

を持っnum_castedはまだ-10ない0xFA000000である私はなぜ、疑問に思います。

biggenに変換されたより小さい型の負数はどのようにして変換されますか?誰かが私を啓発するだろうか?私は、ゼロを使って余白を埋めることを除いて、いくつかの論理があると仮定します。

+0

これは最も驚くべき方法です。 'num'は値-10を持つので、' num_casted'は-10の 'int'表現です。 – chris

+3

[Sign extension](https://en.wikipedia.org/wiki/Sign_extension)。これは値の変換であり、ビットの再解釈ではないので、シフトされたゴミの代わりにコヒーレントな '-10'を検索する作業が行われます。 – Quentin

+0

より大きな型の同じsignednessに変換すると、そのより大きな型は必ず同じ値を表すことができるため、同じ値を持つ表現に変換されます。 – user2079303

答えて

1

2Cの数値表現を持つx86/x86-64アーキテクチャを仮定します。

符号なしの数値がない場合、ビットは符号ビット(変換された値の最後のビット)で埋められます。符号なしの数の場合、欠損ビットはゼロで埋められます。

符号付き変換は、movsx命令(符号拡張付きmov)および符号なし変換movzx(拡張子ゼロのmov)にコンパイルされます。おそらく、これらの命令にはいくつかのバリエーションがあります(引数のサイズが異なる場合、SSEの整数演算の場合、AVX2の整数演算の場合など)。

0

より大きい整数型にキャストすると、の値を保持する必要があります。それ以外の方法は賢明ではありません。私は標準がこれを保証していると信じています。

2の補数では、同じ値と符号を保持しながら数値をより広い型にすることは非常に簡単です。符号ビットが元々持っていたのと同じ値で新しい上位ビットを単純に埋めます。正の数の場合は塗りつぶし、負の場合は塗りつぶしを行います。

関連する問題