1

乱数生成の作成に取り組んでいました。ユニオンを使用してバイトにアクセスしています。

typedef unsigned int uint;
typdef unsigned char uchar;
union
{
uint intBits;
uchar charBits[4];
};

//はい、intが4であることが保証されていないことは知っていますが、それは無視してください。

したがって、番号1がこのユニオンに格納されている場合、次のようになります。

00000000 0000000 00000000 00000001 

右?

-1のintは次のようになりますか

00000000 0000000 00000000 00000001 

また

10000000 0000000 00000000 00000001 

つまり、実際には、uintのアドレスは1であるビットですよね?そして、charBits [0]のアドレスは1であるビットですよね?紛らわしいのはこれです。charBits [1]、ここに来るには左に移動する必要があります

                        ! 
00000000 0000000 00000000 00000001

では、メモリアドレスは右から左または左から右に大きくなりますか?

編集:私は64ビットのWindows7システムInteli7CPUを使用しています。

4

2 に答える 2

1

マシンのアーキテクチャによって異なります。CPUがビッグエンディアンの場合、期待どおりに機能します。

int(4)=> b3 b2 b1 b0

ただし、CPUがリトルエンディアンの場合、バイトは反対方向になります。

int(4)=> b0 b1 b2 b3

バイト内のビット順序は常に左(最上位)から右(最下位)であることに注意してください。

于 2012-08-20T22:48:01.063 に答える
1

これを行う必要はまったくありません。次のように、8ビット値から32ビット整数を簡単に作成できます。

int myInt = byte1 | (byte2<<8) | (byte3<<16) | (byte4<<24);

また、32ビット整数を次のように8ビット値に簡単に分解できます。

byte1 = myInt & 0xff;
byte2 = (myInt >> 8) & 0xff;
byte3 = (myInt >> 16) & 0xff;
byte4 = (myInt >> 24);

したがって、CPUまたはプラットフォームの内部表現の詳細に依存する、移植性がなく、理解しにくいコードを作成する理由はありません。実際に必要なことを明確に実行するコードを書くだけです。

于 2012-08-20T23:03:24.577 に答える