在進行記憶體分配的時候一般都需要在實際使用記憶體大小的基礎上進行記憶體對齊,比如一般32位平台進行4位元組對齊,而64位平台使用8位元組對齊等等。
一般採用的演算法是先利用公式 in
t(a+
b−1b
) (其中a是實際使用的記憶體, b是對齊值)
然後根據這個值乘以b即可得到對應的對齊值假設
a=nb
+m(m
∈[0,
b−1]
) ∵a
b=n+
mb ∵
m∈[0
,b−1
] ∴a
b≤nb
+b−1
b≤a+
b−1b
從上面可以得出ab
向上取整可能是int(a+
b−1b
)但是具體是否有比它小的整數,仍然不能確定.因此我們根據推導一下這個結果與ab
向上取整的結果是否相同假設
a=nb
+m(m
∈[0,
b−1]
) 當m
=0時u
p(ab
)=n
當m≠0
時,up
(ab)
=n而針對int(a+
b−1b
)的結果當m
=0時i
nt(a
+b−1
b)=i
nt(n
b+b−
1b)=
int(
n+1−
1b)
∵1b<1
∴int
(a+b
−1b)
當m≠0時in
t(a+
b−1b
)=in
t(nb
+m+b
−1b)
=int
(n+1
+m−1
b) 當
m=1時
int(
a+b−
1b)=
int(
n+1+
m−1b
)=n+
1 當1
b−1時
m−1b
<1
∴int
(a+b
−1b)
=int
(n+1
+m−1
b)=n
從上面的推導來看二者的值完全相同所以可以得出結論up
(ab)
=int
(a+b
−1b)
所以當我們對a位元組的記憶體進行b位元組的對齊時可以使用公式in
t(a+
b−1b
)×b
其實還有乙個演算法
long(a + b - 1) &~ (b - 1)
也可以計算,但是我沒有弄清楚它的原理是什麼,暫時不管先記住再說^_^ 向上取整演算法
在進行記憶體分配的時候一般都需要在實際使用記憶體大小的基礎上進行記憶體對齊,比如一般32位平台進行4位元組對齊,而64位平台使用8位元組對齊等等。一般採用的演算法是先利用公式 int frac 其中a是實際使用的記憶體,b是對齊值 然後根據這個值乘以b即可得到對應的對齊值 假設 a nb m m i...
向上取整與向下取整
向下取整的運算稱為floor,用數學符號 表示,與之相對的,向上取整的運算稱為ceiling,用數學符號 表示。c語言定義的取整運算既不是floor也不是ceiling,無論運算元是正是負總是把小數部分截斷 truncate 所以當運算元為正的時候相當於floor,當操作符為負的時候相當於ceili...
int向下取整 向上取整
原題點這裡 這道題主要考察的是排序,有個方便的方法就是定義乙個結構體,儲存每個志願者的報名號和筆試分數,然後定義乙個排序就ok了 值得注意的是,題目裡有乙個要求是取給定人數 150 向下取整 的分數作為面試分數線,這裡順便提一下c 裡面的兩個取整函式 地板函式 floor 和天花板函式 ceil 舉...