2

私の主な質問は、パラメーターとして渡された配列を再初期化 (新しいバイト [#]) しない限り、これは常に機能するのでしょうか?

static unsafe decimal GetDecimal(byte[] ba)
{
    decimal* decimal_PTR;
    fixed (byte* byte_PTR = &ba[0])
    {
        decimal_PTR = ((decimal*)byte_PTR);
    }
    return *decimal_PTR;
}

C# がメモリ内の配列をどのように処理するかはわかりません。1時間ほど前までは管理型とは知りませんでした。10 進数を byte[] として渡すかどうかを知りたいのですが、常に正しい値が返されますか? あなたが提供できる他の情報は大歓迎です。

4

1 に答える 1

3

コメントによる@MJLaukalaの説明の後:

  1. .Netの配列は、他の言語と同じように、連続したメモリのブロックです。ただし、C / C ++とは異なり、このブロックは配列の要素だけでなく、配列のランクや長さなどの他の「情報」も格納します。そうは言っても、&ba [0]は配列の最初の要素へのポインターを返し、最後の要素まで移動するようにポインターを安全にインクリメントできます。ba.Lengthは、配列内の要素の数を提供します。

  2. これで、バイト配列が小数を正確に表すことが確実な場合、コードは正常に機能します。

10進数(128ビット)のメモリレイアウト:

最初の2バイトは0です

3番目のバイトには0〜28の値が含まれ、96ビット整数部分を除算して10進値を生成する10の累乗を示します。

4番目のバイト:最初の7ビットはゼロ、8番目のビットは小数点の符号を示します(1は負を意味します)

次の12バイト:10進数の整数部分。

于 2012-06-27T11:33:02.350 に答える