2017-06-22 48 views
0
UINT One = 1; 
LONG  mylong  = LONG(-1) * One; 
LONGLONG mylonglong1 = LONG(-1) * One; 
LONGLONG mylonglong2 = LONG(LONG(-1) * One); 

mylong,mylonglong1およびmylonglong2に格納される値は何ですか?intからlonglongへの危険な変換:警告なし?

mylong  = 0xffffffff   (ok) 
mylonglong1 = 0x00000000ffffffff (why?) 
mylonglong2 = 0xffffffffffffffff (ok) 

私はmylonglong1の結果を知って本当に驚いた、と何のコンパイル警告がないことをもっと驚い。

なぜLONGGLONGにLONGを割り当てると、その左側に0が埋め込まれていますか?実際のプロジェクトで何が起こった


は、関数のCFileを使用する際に問題となっている::)(シーク

virtual LONG Seek(LONG lOff, UINT nFrom); 

は、ここで定義:https://msdn.microsoft.com/en-us/library/aa270542(v=vs.60).aspx 移行

virtual ULONGLONG Seek(LONGLONG lOff, UINT nFrom); 

https://msdn.microsoft.com/library/b2eb5757-d499-4e67-b044-dd7d1abaa0f8.aspx#cfile__seekここで定義されました

移行後引数の変換lOffが期待した結果を得ていなかったために動作しました。式(-1) * (UINT)1

+1

あなたはゲームの推測サイトと混同しましたか?答えを知るには、コードを実行して値を印刷するだけです。 – user463035818

+0

デバッガで実行するのはどうですか? – George

+0

誰もがコンテンツの内容ではなく質問の形式について不平を言っていたので、私はそれを書き換えました。うまくいけば、現在のフォーマットに合っていて、通常の答えを引き付けるだろう。 – CompuChip

答えて

2

は、第一オペランドがoperand conversion rulesに従ってUINTに変換される:符号なしオペランドの変換ランクが署名されたオペランドの変換の順位以上である場合

そうでなければ、符号付きオペランドであります符号なしオペランドの型に変換されます。

したがって、結果タイプがUINTの符号なし乗算があります。 LONGLONGは、UINTで表されるすべての数を表すことができるので、0xffffffffであるので、UINTからLONGLONGへの変換は簡単です。それで、あなたは0x00000000ffffffffになります。あなたがLONG(LONG(-1) * (UINT)1)行うときに0xffffffffその後、符号拡張さLONGLONGになる-1、符号なし変換終わるのに

は今、上記のルールはまだ適用されます。

P.S:UINTとLONGが32ビットで、LONGLONGが64ビットであるWin32/Win64を想定しています。

関連する問題