14

私が知らないことが明らかでないことを確認するためだけに、C++ のインタビューの質問をたくさん行っています。これまでのところ、これを除いて、まだ知らなかったことは何も見つかりませんでした:

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

問題は、「このコードの何が問題なのか?」です。そして、それがターゲットアーキテクチャと関係があることを示唆しています.

答えが「値が初期化されていない」というだけでない限り、問題はありません。私が知る限り、値の最下位 2 バイトをマスクしているだけでlong、少なくとも 2 バイトであることが保証されているため、問題はありません。

longターゲット アーキテクチャでは 2 バイトしかない可能性があり、符号ビットを失っている可能性がありますか? intそれとも、0xFFFF はint2 バイトしかないのでしょうか?

前もって感謝します。

4

6 に答える 6

15

このコードの問題は、符号付きの値に対してビット単位の操作を行うことです。負の値に対するこのような演算の結果は、整数表現によって大きく異なります。

たとえば、次のプログラムを考えてみましょう。

#include <iostream>

int main(void)
{
    long value;
    value = -1; // Some stuff
    value &= 0xffff;
    std::cout << "Value = " << value << std::endl;
}

2 の補数アーキテクチャでは、結果は次のようになります。

Value = 65535

1 の補数アーキテクチャでは、結果は次のようになります。

Value = 65534

符号と大きさのアーキテクチャでは、結果は次のようになります。

Value = 1
于 2010-03-01T23:57:43.813 に答える
7

インタビュアーがあなたに何を期待していたのかを知るのは難しい. 推測するしかありません。

私の推測では、一部のアーキテクチャでは、0xFFFF は符号付き 16 ビット値であり、long は符号付き 32 ビット値です。long 値をマスクするために使用できるように定数を拡張すると、符号が拡張されて 0xFFFFFFFFl になり、これは意図したものではありません。

補遺: 書かれているコードは、私が現在使用している 3 つのコンパイラすべてで正しく動作するため、これは実際、インタビュアーが何を意図したかを理解しようとする推測ゲームです。適切に標準に準拠した 16 ビット コンパイラも正しいコードを生成するため、見落としがあるかどうか、例が実際に壊れていないかどうか、またはインタビュアーが 0xFFFF をlong に拡張することを余儀なくされた場合の符号付き数量。彼に聞いてみるのも面白いでしょう。

于 2010-03-01T22:43:03.030 に答える
1

周囲のコードのコンテキストまたは意図が不明でない限り、このコードには何も問題はありません。

于 2010-03-01T22:48:51.860 に答える
0

0xFFFFこれは暗闇の中でのショットかもしれませんが、long vs intが問題ではなく(他の人がそれに答える回答を投稿している) 、タイプに必要な全量を網羅していると仮定すると、これはただ作成value = 0xFFFFしているだけではありませんビット操作の必要はありませんか?ビット操作は冗長ではありませんか?

私が見ることができる他の唯一のことは、質問をしている人が、longに含まれる欠落データが0xFFFFを使用するだけでは影響を受けないことを理解してほしいかどうかです。

私には、質問がここでどのように提示されているかに基づいて尋ねる質問に少し奇抜なものがあります。

于 2010-03-01T23:15:30.827 に答える
0

私たちは皆、一生懸命考えすぎているのではないかと思います。

このコードの問題点は、値が初期化されていないことです。問題は、 &= (または += 、 -= /= など) が、単位化された値に対して使用された場合に無意味であることを理解していますか?

値が初期化されている場合、動作は明確に定義されています。最下位の 16 ビットが保持され、残りはゼロに設定されます

于 2010-03-02T00:04:35.033 に答える
-1

私にはビッグエンディアンとリトルエンディアンのように聞こえます。 http://en.wikipedia.org/wiki/エンディアンネス

于 2010-03-01T22:42:19.293 に答える