3

ビットをシフトするのは初めてですが、次のスニペットをデバッグしようとしています:

if (!(strcmp(arr[i].GetValType(), "f64")))
 {
        dem_content_buff[BytFldPos] = tmp_data;
     dem_content_buff[BytFldPos + 1] =  tmp_data >> 8;
     dem_content_buff[BytFldPos + 2] = tmp_data >> 16;
     dem_content_buff[BytFldPos + 3] = tmp_data >> 24;
     dem_content_buff[BytFldPos + 4] = tmp_data >> 32;
     dem_content_buff[BytFldPos + 5] = tmp_data >> 40;
     dem_content_buff[BytFldPos + 6] = tmp_data >> 48;
     dem_content_buff[BytFldPos + 7] = tmp_data >> 56;
        }    

「32」から「56」までの行のシフト カウントが大きすぎるという警告が表示されます。述語の「f64」は、データが 64 ビット データであることを意味します。

これはどのように行うべきですか?

編集:

コードをもっと入れるべきでした。

tmp_data = simulated_data[index_data];

if (!(strcmp(dems[i].GetValType(), "s32")))

{ dem_content_buff[BytFldPos] = tmp_data; dem_content_buff[BytFldPos + 1] = tmp_data >> 8; dem_content_buff[BytFldPos + 2] = tmp_data >> 16; dem_content_buff[BytFldPos + 3] = tmp_data >> 24;
}

if (!(strcmp(dems[i].GetValType(), "f64"))) { dem_content_buff[BytFldPos] = tmp_data; dem_content_buff[BytFldPos + 1] = tmp_data >> 8; dem_content_buff[BytFldPos + 2] = tmp_data >> 16; dem_content_buff[BytFldPos + 3] = tmp_data >> 24; dem_content_buff[BytFldPos + 4] = tmp_data >> 32; dem_content_buff[BytFldPos + 5] = tmp_data >> 40; dem_content_buff[BytFldPos + 6] = tmp_data >> 48; dem_content_buff[BytFldPos + 7] = tmp_data >> 56; }

したがって、dem_content_buff現在はintのみを保持しています。この配列を 64 ビット データにも使用できませんか?

4

4 に答える 4

2

の型はtmp_data何ですか?

私の推測ではtmp_data、それは 32 ビットのみであるため、エラーが発生します。unsigned long longこれは、非標準の (ただし十分にサポートされている)データ型を使用して実現できる 64 ビットの unsigned int である必要があります。

于 2010-03-15T18:14:08.223 に答える
1

シフト演算子が32ビットを超えるシフトを機能させるには、tmp_data他のいくつかの回答が示すように、64ビットタイプである必要があります。

ただし、simulated_data64ビット型の配列にすることもできます。そうしないと、元の値を割り当てるときに最上位ビットtmp_dataが常にゼロ(または符号拡張されたビットのセット)になります。1

tmp_data = simulated_data[index_data];
于 2010-03-15T18:29:26.583 に答える
1

Visual Studioを使用している場合は、tmp_dataを次のように定義していることを確認してください。

__int64 tmp_data;              // Visual studio version

それ以外の

unsigned long long tmp_data;   // GCC version
于 2010-03-15T18:30:35.677 に答える
1

unsinged long long が機能する前に提案されたように、tmp_data には 64 ビットの long 型を使用するようにしてください。ただし、コンパイラとアーキテクチャのドキュメントを確認してください。

コードは次のようになります。また、demp_content_buff が unsigned char * または unsigned char [] として宣言されていることを確認してください。

次に、コードを次のように変更します。

if (!(strcmp(arr[i].GetValType(), "f64")))
    {
        dem_content_buff[BytFldPos] =  ( tmp_data & 0xff );
        dem_content_buff[BytFldPos + 1] =  (tmp_data >> 8 ) & 0xff ;
        dem_content_buff[BytFldPos + 2] =  (tmp_data >> 16) & 0xff ;
        dem_content_buff[BytFldPos + 3] =  (tmp_data >> 24) & 0xff;
        dem_content_buff[BytFldPos + 4] =  (tmp_data >> 32) & 0xff;
        dem_content_buff[BytFldPos + 5] =  (tmp_data >> 40) & 0xff;
        dem_content_buff[BytFldPos + 6] =  (tmp_data >> 48) & 0xff;
        dem_content_buff[BytFldPos + 7] =  (tmp_data >> 56) & 0xff;
        }   
于 2010-03-15T18:20:55.177 に答える