25

私はこのページを見ていました: http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp、そしてこの質問を理解していませんでした:

次のコードの潜在的な問題は何ですか?

long value;
//some stuff
value &= 0xFFFF;

注: 候補者が開発しているベース プラットフォームについて、候補者にヒントを与えます。それでもコードに問題が見つからない場合は、C++ の経験がありません。

誰かがそれについて詳しく説明できますか?

ありがとう!

4

7 に答える 7

41

ここでのいくつかの回答intは、anの幅が16ビットの場合、0xFFFF負であると述べています。本当じゃない。 0xFFFF決して負ではありません。

16進リテラルは、それを含むのに十分な大きさの次のタイプの最初のもので表されます: int、、、、および。unsigned intlongunsigned long

intの幅が16ビットの場合、はで0xFFFF表現できる最大値よりも大きくなりますint。したがって、0xFFFFはタイプunsigned intであり、を表すのに十分な大きさであることが保証されています0xFFFF

の評価のために通常の算術変換が実行されると&unsigned intはに変換されlongます。16ビットで表現できるすべての値は32ビットでも表現できるため、16ビットunsigned intからへの変換はlong明確に定義されています。 unsigned intlong

初期型は符号なしであるため、符号拡張は必要ありません。0xFFFF使用した結果は、を使用した結果と同じ0xFFFFLです。

または、intが16ビットより広い場合0xFFFFは、タイプintです。これは署名されていますが、正の数です。この場合、両方のオペランドが符号付きでありlong、変換ランクが高いため、通常の算術変換によってint再びに昇格されます。long


他の人が言っているように、数値結果は符号付きの表現方法に依存するため、符号付きオペランドに対してビット単位の演算を実行することは避けてください。

それを除けば、このコードには特に問題はありません。宣言されたときに初期化されないのはスタイルの問題だと私は主張しvalueますが、それはおそらくちょっとしたレベルのコメントであり、//some stuff省略されたセクションの内容に依存します。

uint32_t移植性を高めるために、代わりに固定幅の整数型(のような)を使用することもおそらく望ましいlongですが、実際には、それもあなたが書いているコードとあなたの基本的な仮定に依存します。

于 2010-11-23T02:21:30.373 に答える
3

long のサイズによっては、0xffff リテラル (-1) がより大きなサイズに昇格され、符号付きの値になると、符号が拡張され、0xffffffff (まだ -1) になる可能性があると思います。

于 2010-11-23T01:45:50.627 に答える
2

少なくとも前のサイズ (int) と同じ大きさでなければならないことを除けば、long には定義済みのサイズがないためだと思います。したがって、サイズに応じて、値をビットのサブセットに切り捨てる (long が 32 ビットを超える場合) か、オーバーフローする (32 ビット未満の場合) 可能性があります。

ええ、ロング (仕様に従って、コメントのリマインダーに感謝します) は、少なくとも -2147483647 から 2147483647 (LONG_MIN および LONG_MAX) を保持できる必要があります。

于 2010-11-23T01:40:19.847 に答える
1

1つの値は実行前に初期化されないため、動作は未定義であると思います。値は何でもかまいません。

于 2010-11-23T01:44:04.293 に答える
0

long 型のサイズはプラットフォーム/コンパイラ固有です。

ここで言えることは次のとおりです。

  1. サイン入りです。
  2. value &= 0xFFFF; の結果はわかりません。たとえば、 value &= 0x0000FFFF; のようになる可能性があるためです。そして期待したことをしません。
于 2010-11-23T01:45:03.147 に答える
0

これはバッファ オーバーフローや悪用される可能性のあるその他のエラーではないため、バグではなくスタイルの問題であると主張する人もいるかもしれませんが、質問者が探している答えは次のとおりであると 99% 確信しています。value割り当てられる前に操作されます。値は任意のガベージになる予定であり、それが意図されたものである可能性は低いため、「潜在的に間違っている」.

于 2010-11-23T05:52:02.163 に答える