2015-08-27 31 views
6

嗨考慮這個代碼意義:的這個C代碼的某些部分不適合我

uint16_t dest_pid; 
uint8_t *p; 

pf->dest_pid = p[0] + (p[1] << 8) //(p[1] << 8) equals 0 right? 

此代碼是嵌入式操作系統的驅動程序的一部分。 一些想法可能是這個陳述背後的想法?或者可能是我缺少一些重要的東西?

+0

取消引用未初始化的指針?不知道這個想法是什麼,但它肯定不是一個好主意。除非你錯過了一些代碼? – mathematician1975

+1

'(p [1] << 8)'是表達式的一部分。它有一個類型(無符號),它是從p [1]類型派生出來的:它只能「繼承」未簽名的質量,而不是大小。 – joop

+0

看這裏:http://stackoverflow.com/questions/12131568/bit-shifting-a-byte-by-more-than-8-bit – Downvoter

回答

4

第一:dest_pidpf後是從結構的一部分,我認爲這是另一個變量則uint16_t dest_pid;

二:p是一個指向uint8_t,當你做(p[1] << 8)你轉移什麼是裏面的指針8,用於舉例如果p[1] = 0xE5在移動後將是0xE500。請記住,您將結果放在dest_pid這是一個2字節的變量。

最後一行的翻譯是最有可能採取的pid低字節(少顯著),並把它添加到的pid高字節(8移動),並把它放在pf->dest_pid,你可能會覺得,爲什麼他不從一開始就發送2個字節,其原因可能是因爲他從一個每單位時間(週期)只發送一個字節的總線獲取它。

8

我假設你的p是有意義的初始化(指向一些有效的位置)。

然後在p[0] + (p[1] << 8)p[1]將被隱式提升到unsigned做左移<< 8之前,所以代碼確實使感(例如,在32個如ARM處理器)。非正式地它使得其低8位是從p[0]和高8位是從p[1]

眼觀講一個16位的數,隱式規則是,在C的算術運算是在int至少(和從來沒有在更小的塊數據的如shortuint8_tchar)。但細節更爲複雜(並且從C89到C99以及C11標準略有進化)。

+4

假設類型爲'uint8_t',由於_integer promotions_,'p [1]'將被隱式轉換爲'int'(或者如果您願意,可以是'signed')。在這種情況下沒有其他辦法。 –

+0

這是正確的,但是p [無論在裏面]的類型是八位。 如果它被明確鑄造爲「.. +(uint16_t)(p [1] << 8)」,我會理解,它將等於p [1] * 256。現在我只看到這個「(eight_bit_var < <8)「(對我來說)意味着零。 –

+0

@RadoslawKrasimirow:你錯了:'(eightbitvar << 8)'不是8位操作數移位,而是'int'移位。所以它並不總是零。 –

相關問題