1

このフィールドを考えると:

char lookup_ext[8192] = {0}; // Gets filled later

そして、この声明:

unsigned short *slt = (unsigned short*) lookup_ext;

舞台裏で何が起こっているのですか?

lookup_ext[1669] は 67 = 0100 0011 (C) を返し、lookup_ext[1670] は 78 = 0100 1110 (N) を返し、lookup_ext[1671] は 68 = 0100 0100 (D) を返します。それでも slt[1670] は 18273 = 0100 0111 0110 0001 を返します。

私はこれを C# に移植しようとしているので、簡単な方法以外に、ここで実際に何が起こっているのかも疑問に思っています。C++ を定期的に使用してからしばらく経ちました。

ありがとう!

4

4 に答える 4

6

あなたが示すステートメントは、charをunsigned shortにキャストしません。charへのポインターをunsigned shortへのポインターにキャストします。つまり、ポイント先データの通常の算術変換は行われず、基になる char データは、slt変数を介してアクセスされたときに unsigned short として解釈されるだけです。

sizeof(unsigned short)が 1 である可能性は低いため、slt[1670]必ずしも に対応するとは限らないことに注意してくださいlookup_ext[1670]。たとえば、sizeof(unsigned short)が 2 の場合、 と に対応する可能性が高くlookup_ext[3340]なりlookup_ext[3341]ます。

元のコードがこのエイリアシングを使用している理由を知っていますか? 必要でない場合は、C++ コードをよりクリーンにして、移植する前に動作が変更されていないことを確認する価値があります。

于 2008-12-31T09:48:22.280 に答える
2

私の理解が正しければ、型変換はサイズ 8192 の char 配列をその半分のサイズ (4096) の short int 配列に変換します。

したがって、質問で何を比較しているのかわかりません。slt[1670] は、lookup_ext[1670*2] および lookup_ext[1670*2+1] に対応する必要があります。

于 2008-12-31T09:47:49.690 に答える
1

さて、この発言

char lookup_ext[8192] = {0}; // Gets filled later

定義が発生する場所に応じて、配列をローカルまたは非ローカルに作成します。集約初期化子を使用してそのように初期化すると、すべての要素がゼロに初期化されます (最初は明示的に、残りは暗黙的に)。したがって、プログラムがゼロ以外の値を出力するのはなぜだろうか。読み取りの前に塗りつぶしが発生しない限り、それは理にかなっています。

unsigned short *slt = (unsigned short*) lookup_ext;

そのポインターのターゲットから読み取ると、配列を構成するバイトが unsigned short オブジェクトとして解釈されます。厳密に言えば、配列が適切に整列されているかどうかを確認できず、元の指定された型 (unsigned char <-> unsigned short) を指していないポインターから読み取るため、上記は未定義の動作です。C++ では、他のポッド (単純な古いデータ。大まかに言えば、C でも可能なすべての構造体と単純な型 (short など)) から値を読み取る唯一の移植可能な方法は、次のようなライブラリ関数を使用することです。memcpyまたはmemmove

したがって、*slt上記を読んだ場合、配列の最初のsizeof(*slt)バイトを解釈し、unsigned short (と呼ばれる) として読み取ろうとしますtype pun

于 2008-12-31T10:00:36.357 に答える
0

「unsigned short slt = (unsigned short ) lookup_ext;」を実行すると、no. (unsigned short) のサイズに相当するバイト数が、lookup_ext で指定された場所から取得され、slt が指す場所に格納されます。unsigned short は 2 バイトになるため、lookup_ext の最初の 2 バイトは slt で指定された場所に格納されます。

于 2008-12-31T09:49:42.103 に答える