2

8 つの位置を持つ char の配列 (char data[8];) を取得しました。この配列には unsigned long long int 値 (8 バイトのサイズ) があります... data[0] には long long の最初のバイトがあります。 int、data[1] には 2 番目などがあります。私の質問は、その値を unsigned long long 変数に戻す方法ですか?

シフトを試みましたが、値が元の値と等しくありませんでした。元の配列を変更せずにこれを行うにはどうすればよいですか...

バイトの順序は、変数の通常の順序 (上位ビットから下位ビットへ) のリトル エンディアンです。

予想とは異なる値を出力するコードを次に示します。

char vec[8]={0,0,0,0,0,0,0,1};

unsigned long long value = *((unsigned long long*) vec);

std::cout<<value;

return 0;

結果は 1 になるはずですが、代わりに 72057594037927936 になります。

4

4 に答える 4

4

配列のバイト順が結果の値dataと同じであると仮定しますlong long

unsigned long long ll;
assert(sizeof ll == sizeof data);
memcpy(&ll, data, sizeof ll);

キャストベースのソリューションは避けてください。それらは厳密なエイリアシングのセマンティクスに違反しているため、動作が保証されていません。

于 2012-07-26T03:47:46.213 に答える
1

ハードウェア表現によっては直接キャストが機能しない場合がありますが、ほとんどの場合はこれで機能します。

long long to_llong(unsigned char *data) {
    long long v = 0;
    for (int i = 0; i < 8; i++) {
      v = (v << 8) | data[i];
    }
    return v;
}
于 2012-07-26T03:50:28.483 に答える
1

できるよ:

unsigned long long value = *((unsigned long long*) data);

ただし、これは次のことを前提としています。

  1. dataとしてアクセスできるように適切に配置されていますlong long。たとえば、long long8 バイトのアラインメントが必要であるが、アラインメントがdata4 バイトしかない場合、悪いことをする可能性があります。
  2. のバイトはdata、現在のマシンの のバイト順と同じ順序で格納されlong longます。エンディアンを参照してください。
于 2012-07-26T03:45:32.410 に答える
0

最初のバイトとはどういう意味ですか? それは最下位バイトですか、それとも最上位バイトですか?

その質問に対する答えによって、数値がリトル エンディアンかビッグ エンディアンかが決まります。ウィキペディア リンク

値のエンディアン スタイルがシステムと同じである場合は、最初のバイトのアドレスを「unsigned long long *」に直接キャストできますが、同じでない場合はエンディアン スタイルを変換する必要があります。

于 2012-07-26T04:07:40.333 に答える