2012-08-26 31 views
4

here 當從字節轉換緩衝回unsigned long int類型:位通過移位字節多於8位

unsigned long int anotherLongInt; 

    anotherLongInt = ((byteArray[0] << 24) 
        + (byteArray[1] << 16) 
        + (byteArray[2] << 8) 
        + (byteArray[3])); 

其中的ByteArray被聲明爲unsigned char byteArray[4];

問題:

我認爲byteArray[1]將只是一個無符號字符(8位)。當左移16時,是不是將所有有意義的位移出並用0填充整個字節?顯然它不是8位。也許它正在改變整個連續4個字節的byteArray?但我不明白這是如何工作的。

回答

8

在算術方面byteArray[0]被提升爲要麼intunsigned int,所以移位是合法的,甚至懂事(我喜歡做按位的東西時,只處理unsigned類型)。

6.5.7按位的移位運算符

優惠在每個操作數的執行的整數。結果的類型是提升的左操作數的類型。

而整數優惠:

6.3.1.1

如果int可以表示原始類型的值被轉換爲int的所有值; 否則,它被轉換爲一個unsigned int。這些被稱爲整數促銷

2

無符號字符在轉換時隱式轉換爲int。不知道究竟是什麼類型,我依賴於平臺和編譯器。爲了得到你想要的,明確地投出字節比較安全,這也使得它更便攜,讀者立即看到你打算做什麼:

unsigned long int anotherLongInt; 

anotherLongInt = (((unsigned long)byteArray[0] << 24) 
       + ((unsigned long)byteArray[1] << 16) 
       + ((unsigned long)byteArray[2] << 8) 
       + ((unsigned long)byteArray[3]));