[問題] C #define function question

看板C_and_CPP作者 (周末也會笑)時間10年前 (2015/11/17 22:53), 10年前編輯推噓2(204)
留言6則, 2人參與, 最新討論串1/1
開發平台(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

11/17 23:08, , 1F
指標對齊, 例如 ALIGNED_ADDR(malloc(...), 16) 會得到一個
11/17 23:08, 1F

11/17 23:09, , 2F
對齊到 16-byte 倍數的指標位置
11/17 23:09, 2F
(AlignUnit))&~((AlignUnit)- 1 再請教一下這邊的"&~"是甚麼意思呢? 位甚麼後面要再減1呢? 另外照您舉例的意思,如果AlignUnit是0x10 的話也會對齊 16B是嗎? ※ 編輯: hibiscus520 (220.137.22.105), 11/17/2015 23:42:31

11/17 23:59, , 3F
那是 & 和 ~ 兩個運算子, 詳細說的話要一篇
11/17 23:59, 3F

11/17 23:59, , 4F
簡單講它利用這兩個位元運算子去算出一個比給定指標大的
11/17 23:59, 4F

11/18 00:00, , 5F
某個 2 的次方數(即對齊需求)的倍數的值
11/18 00:00, 5F

11/18 00:06, , 6F
好的,非常謝謝你。<(_._)>
11/18 00:06, 6F
文章代碼(AID): #1MIpzJ5m (C_and_CPP)