作者hibiscus520 (周末也會笑)
看板C_and_CPP
標題[問題] C #define function question
時間Tue Nov 17 22:53:04 2015
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
VC++
問題(Question):
最近在看怎麼控制 SATA device 的code.
下面把ALIGNED_ADDR(base, AlignUnit) 定義為後面那串實在難懂.
故上來請教各位大神們. 麻煩幫忙小弟解惑一下.3Q
/*==========================================================
IDE/SATA device access function implementation
===========================================================*/
#define ALIGNED_ADDR(base, AlignUnit) \
(PVOID)(((int)(base)+(AlignUnit))&~((AlignUnit)- 1))
餵入的資料(Input):
NA
預期的正確結果(Expected Output):
NA
錯誤結果(Wrong Output):
NA
程式碼(Code):(請善用置底文網頁, 記得排版)
補充說明(Supplement):
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.137.22.105
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1447771987.A.170.html
推 LPH66: 指標對齊, 例如 ALIGNED_ADDR(malloc(...), 16) 會得到一個 11/17 23:08
→ LPH66: 對齊到 16-byte 倍數的指標位置 11/17 23:09
(AlignUnit))&~((AlignUnit)- 1 再請教一下這邊的"&~"是甚麼意思呢?
位甚麼後面要再減1呢? 另外照您舉例的意思,如果AlignUnit是0x10 的話也會對齊
16B是嗎?
※ 編輯: hibiscus520 (220.137.22.105), 11/17/2015 23:42:31
推 LPH66: 那是 & 和 ~ 兩個運算子, 詳細說的話要一篇 11/17 23:59
→ LPH66: 簡單講它利用這兩個位元運算子去算出一個比給定指標大的 11/17 23:59
→ LPH66: 某個 2 的次方數(即對齊需求)的倍數的值 11/18 00:00
→ hibiscus520: 好的,非常謝謝你。<(_._)> 11/18 00:06