2017-04-09 45 views
1

我目前正在編寫一個涉及二進制內存的程序,並且我需要一個無符號long long int中的特定位序列。C意外按位或更改值

現在,我正在循環這段代碼4次,試圖創建一個32位序列。

unsigned long long int currentEntry = 0; 
for (int j = 0; j < 4; ++j){ 
    currentEntry = (currentEntry << 8); 
    currentEntry = (currentEntry | (unsigned long long int)entryBuffer[i][j]); 
} 

entrybuffer [i] [j]是包含我投進去一個unsigned long long int型的一個字節值,似乎只要我可以告訴是工作的一個字符,直到我得到一個奇怪的錯誤。 例如,這裏是以二進制形式currentEntry變量:

//goal bit sequence: 00001000000001001010000011000000 

currentEntry = (currentEntry << 8); 
//00000000 
currentEntry = (currentEntry | (unsigned long long int)entryBuffer[i][j]); //entrybuffer[i][j] = 00001000 
//00001000 
currentEntry = (currentEntry << 8); 
//0000100000000000 
currentEntry = (currentEntry | (unsigned long long int)entryBuffer[i][j]); //entrybuffer[i][j] = 00000100 
//0000100000000100 
currentEntry = (currentEntry << 8); 
//000010000000010000000000 
currentEntry = (currentEntry | (unsigned long long int)entryBuffer[i][j]); //entrybuffer[i][j] = 10100000 
//111111111111111110100000 (what?)***** 
currentEntry = (currentEntry << 8); 
//11111111111111111010000000000000 
currentEntry = (currentEntry | (unsigned long long int)entryBuffer[i][j]); //entrybuffer[i][j] = 11000000 
//11111111111111111111111111000000 

我似乎失去了一些東西顯而易見的,我不知道是否有人能幫助我想出解決辦法。我希望代碼具有足夠的意義。

顯然,按位OR正在改變某些東西,或者某處溢出了某些東西,這就是爲什麼我使currentEntry成爲一個unsigned long long int。我顯然只需要4個字節的存儲空間,而且我明白這在不同機器之間有所不同,但是我認爲一個無符號long long int對於我的目的就足夠了。 如果需要更多信息和上下文,請告訴我。

謝謝!

+0

你不是在編譯時啓用了警告(例如'-Wall -Wtratra')嗎? *嚴格別名*規則? –

+0

*是什麼*'entryBuffer'?它的*類型*是什麼? –

+0

@Some程序員哥們entryBuffer是個char。我也在編寫警告,但我不認爲這是嚴格的別名規則。 – storm143

回答

2

類型char可以是unsignedsigned,這取決於編譯器。在你的情況下,它似乎是signed

這意味着當您將其轉換爲較大類型時,您會遇到一種稱爲的符號擴展。所有你在二進制數中看到的都是因爲這個,以及two's complement(處理負數的最常見方式)是如何工作的。

如果要存儲無符號的小8位值,請使用明確的uint8_t類型(請注意u前綴,代表unsigned)。見例如this fixed-width integer reference瞭解更多信息。

+2

實際上它會工作,如果字符,擴展到longlong後,屏蔽0xFF。 – davidbak

+0

@Some程序員哥們謝謝!這樣可行。今天學到了新東西。我知道它必須處理兩個補充的東西,但是我不知道字符類型可以是有符號的還是無符號的。我最終只是將entryBuffer投入爲(unsigned long long int)(uint8_t)entryBuffer [i] [j]),這非常醜陋,但很快就會解決。 – storm143