2010-03-15 34 views
3

我是新來的換擋位,但我想調試下面的代碼片段:C++換擋位

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;
}

如果((的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現在只持有整數。我可以不使用這個數組作爲64位數據嗎?

+3

'tmp_data'是什麼類型?你可能會希望這是一個64位的類型。 – 2010-03-15 18:11:42

回答

1

請確保對tmp_data使用64位long類型,正如在未被應用的long 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; 
     } 
2

tmp_data是什麼類型的?

我的猜測是tmp_data只有32位,因此是錯誤。它需要是一個64位無符號整數,這可以使用非標準(但支持良好)的unsigned long long數據類型來實現。

+0

此代碼不會對'dem_content_buff'的類型設置任何限制。實際上,它看起來應該是一個8位的類型。 – 2010-03-15 18:14:57

+0

tmp_data是一個int。 – Blade3 2010-03-15 18:15:53

+0

@Carl,好吧,我誤解了代碼。 – 2010-03-15 18:19:14

1

對於移位運算工作移超過32位,tmp_data將需要一個64位型 - 如所示幾個其他的答案。

但是,您還希望simulated_data是某個64位類型的數組,否則當您分配其原始值時,tmp_data將始終爲零(或符號擴展集合1位)的最高有效位:

tmp_data = simulated_data[index_data]; 
1

如果你正在使用Visual Studio,請確保您定義tmp_data爲:

__int64 tmp_data;    // Visual studio version 

,而不是

unsigned long long tmp_data; // GCC version