符号なしのショートに文字をキャスト:舞台裏で何が起こるのでしょうか?

StackOverflow https://stackoverflow.com/questions/402616

  •  03-07-2019
  •  | 
  •  

質問

このフィールドを指定:

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 ++を定期的に使用してからしばらく経ちました。

ありがとう!

役に立ちましたか?

解決

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

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

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

他のヒント

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

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

まあ、この声明

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

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

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

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

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

<!> quot; unsigned short slt =(unsigned short )lookup_ext; <!> quot;、no (unsigned short)のサイズに相当するバイト数は、lookup_extで指定された場所から取得され、sltが指す場所に格納されます。 unsigned shortは2バイトであるため、lookup_extの最初の2バイトはsltで指定された場所に格納されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top