c語言int length是什麼(c語言不定參數宏INTSIZEOF的由來)
2023-10-22 16:54:02 3
c語言int length是什麼? 首先,我聲明一下,這篇文章適合想理解c的人群來看的,當然不是說我特別厲害什麼的,因為只是一個小知識點而已,主要是我是從用戶的角度來看的,我這篇文章在我寫完的時候,發現並沒是沒什麼圖片的,沒有什麼興趣點,只有理論的若是我來看的話,我也不會去看的所以,怎麼說尼,慢慢看是一定會看懂得若是看不懂算我輸,若是覺得很繁瑣還是建議直接退出為好,接下來我們就來聊聊關於c語言int length是什麼?以下內容大家不妨參考一二希望能幫到您!
c語言int length是什麼
首先,我聲明一下,這篇文章適合想理解c的人群來看的,當然不是說我特別厲害什麼的,因為只是一個小知識點而已,主要是我是從用戶的角度來看的,我這篇文章在我寫完的時候,發現並沒是沒什麼圖片的,沒有什麼興趣點,只有理論的。若是我來看的話,我也不會去看的。所以,怎麼說尼,慢慢看是一定會看懂得。若是看不懂算我輸,若是覺得很繁瑣還是建議直接退出為好。
INTsizeof 宏,獲取類型佔用的空間長度,最小佔用長度為int的整數倍:
#define _INTSIZEOF(n) ( (sizeof(n) sizeof(int) - 1) & ~(sizeof(int) - 1) )
最小佔用長度為int的整數倍的意思是字節小於或者等於4位元組的,那麼_INTSIZEOF(n)的值就是4,而大於4的就是4的倍數的字節數。這個宏的整體結構就是輸入的字節數是4個字節的多少個,然後在乘以4位元組就是宏的值,比如n是double,那麼sizeof(double)就是8位元組,也就是sizeof(int)的2倍,然後再乘以4位元組(也就是2*4 = 8)字節那麼這個紅就是8位元組,若是char,那麼這個宏的值就是4位元組。
理解這個宏需要點數學知識,先舉個例子,假設一個盒子能放2個球,目前有6個球,那麼就需要3個盒子,若是有5個球,那麼還是需要3個盒子。擴展一下,若是有n個球,每個盒子能容乃下m個球,那麼需要多少個盒子???這裡直接給出結論就是(n m - 1)/m個,當然"/"就如c語言中的「/」一個意思也就是商取整數的形式。這裡簡單的列出證明的過程:
1):若是n為m的整數倍,即n=mx,那麼帶入上式,(mx m - 1)/m = x (m -1)/m,由於"/"表示取整,那麼(m - 1)/m就為0,所以(mx m - 1)/m = x。
2):若是n不為m的整數倍,即n=mx r(1 <= r < m),帶入上式(n m - 1)/m中就是
(mx r m - 1)/m = x (m r-1)/m;由於1 <= r < m,所以m <= (m r-1) <2m-1<2m ,那麼也就是1 <= (m r-1)/m <2,由於"/"表示取整,所以(m r -1)/m = 1,所以(n m - 1)/m = x 1。注意這裡的x,根據n=mx r,x的意思是m的整數倍,當n不為m的整數倍時就需要x 1個,正好當n不為m的整數倍時,就需要x 1個盒子,也就是要(n m - 1)/m個盒子。
結合1),2)得出的結論就是(n m - 1)/m,我們再來看看上面的宏#define _INTSIZEOF(n) ( (sizeof(n) sizeof(int) - 1) & ~(sizeof(int) - 1) ),這裡的(sizeof(n) sizeof(int) - 1)是不是很像(n m - 1),sizeof(n)可以理解為有n個球,sizeof(int)可以理解為一個盒子能容納m個球。
接下來我們分析一下& ~(sizeof(int) - 1)是什麼意思,再知道這以前我們得先假設m為2的冪的某一個數,也就是m = 2^x次方,然後結合計算機的基礎知識來解釋。上面說了這個宏的結構就是輸入的字節數是4個字節的多少倍,然後在乘以4位元組就是宏的值。為了方便,我們設n = sizeof(n),m = sizeof(int),也就是(n m - 1)/m中的n和m,那麼我們可以得到(n m - 1)/m的意思就是sizeof(n)是需要(n m - 1)/m = x個sizeof(int),那麼x * m就是這個宏的值,也就是((n m - 1)/m ) * m就是宏的值,注意數學與計算機科學的差別,數學上((n m - 1)/m ) * m = (n m - 1),但是在計算機科學上先除,在乘不會得到原值的,原因就是(n m - 1)/m = (n m-1) >> x(上面假設了m = 2^x),也就是(n m-1) 向右移動x位(因為某一個二進位數除以2(2 = 2^1)表示向右移動1(次冪)位,所以這裡移動了x位),然後在向做移動x位,這個值很明顯就不是原值了,比如1111,右移動2位就是0011了,在左移動2位就為1100了這就不是1111了。上面說了((n m - 1)/m ) * m就是宏的值,((n m - 1)/m ) * m也就是((n m - 1)>>x)<>x)<<x與& ~(sizeof(int) - 1)有什麼聯繫???(n m - 1)右移動x位,在左移動x位,也就是把(n m - 1)二進位形勢下的最右邊的x位全清為0了,比如上面的例子1111右移動2位,在左移動2位得到了1100,所以我們可以發現((n m - 1)>>x)<>x)<<x = (n m - 1) & ~(m - 1),((n m - 1)/m ) * m的物理意義就是sizeof(n)需要多少個sizeof(int)才能滿足,然後在乘以m表示總共需要的字節數(個數*字節數 = 總字節數),然後根據上面的等式就得到了(n m - 1) & ~(m - 1),也就是這個宏的由來了!!!
,