我目前正在編寫一個涉及二進制內存的程序,並且我需要一個無符號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對於我的目的就足夠了。 如果需要更多信息和上下文,請告訴我。
謝謝!
你不是在編譯時啓用了警告(例如'-Wall -Wtratra')嗎? *嚴格別名*規則? –
*是什麼*'entryBuffer'?它的*類型*是什麼? –
@Some程序員哥們entryBuffer是個char。我也在編寫警告,但我不認爲這是嚴格的別名規則。 – storm143