1
int compare_acd(const void *a, const void * b)
{
return ((int)(*((ADC_VALUE_TYPE*)a)) - (int)(*((ADC_VALUE_TYPE*)b)));
}
在我的情況ADC_VALUE_TYPE
是uint16_t
,但那不是規則。這是雙重鑄造有效/正確的代碼?
int compare_acd(const void *a, const void * b)
{
return ((int)(*((ADC_VALUE_TYPE*)a)) - (int)(*((ADC_VALUE_TYPE*)b)));
}
在我的情況ADC_VALUE_TYPE
是uint16_t
,但那不是規則。這是雙重鑄造有效/正確的代碼?
不需要外部的一對括號,return
不是函數。
除此之外,我看不到一個問題......您在解引用之前投射指針,讀取適當的位數,然後「向上轉換」到int
。
更新:根據您的評論,似乎你想要一個負面的回報,例如, a
指向的值小於b
指向的值,因此需要將其轉換爲帶符號的類型。我想這很好,不是100%確定是否需要,但至少很清楚發生了什麼事情。
當然它可以被分解成多個報表更加清晰:
int compare_acd(const void *a, const void * b)
{
const ADC_VALUE_TYPE va = *(ADC_VALUE_TYPE) a;
const ADC_VALUE_TYPE vb = *(ADC_VALUE_TYPE) b;
/* Cast to int to get signed response if a < b. */
return (int) va - (int) vb;
}
這可能是我怎麼會寫。
我認爲,如果我刪除(int)它不會返回負值,因爲減去uint - uint總是非負數,或者我錯了嗎? – 2011-12-22 13:01:28
這裏的隱含括號在哪裏。也許'(int)va - (int)vb'實際上就像'(int)(va - (int)vb)'?我可能是錯的,但我很偏執。我想我會寫'((int)va) - ((int)vb)' – 2011-12-22 13:15:48
(別管我最後的評論)。這是安全的。演算將在減法之前進行。 http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence – 2011-12-22 13:17:36