c語言int length是什麼? 首先,我聲明一下,這篇文章适合想理解c的人群來看的,當然不是說我特别厲害什麼的,因為隻是一個小知識點而已,主要是我是從用戶的角度來看的,我這篇文章在我寫完的時候,發現并沒是沒什麼圖片的,沒有什麼興趣點,隻有理論的若是我來看的話,我也不會去看的所以,怎麼說尼,慢慢看是一定會看懂得若是看不懂算我輸,若是覺得很繁瑣還是建議直接退出為好,接下來我們就來聊聊關于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,那麼((n m - 1)>>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位全清為0了,那麼(n m - 1)與上某一個值把最右邊的x位全清0,那麼整個分析就算結束了,答案就不說,也就是上面的~(sizeof(int) - 1)。我肯定是推不出這個解果的,推不出不要緊,我們先理解它。首先sizeof(int)是2的2次幂,二進制形式是0100,我們從這個0100出發,上面說了,(n m - 1)要先右移動x位,在左移動x位,而m = 2^x =sizeof(int),那麼x = 2的。我們結合這個x(在這裡該值為2)與0100來理解這個式子~(sizeof(int) - 1),我們得目的是使得(n m - 1)的最右邊x(x = 2)位清0,注意0100隻有一個1,先把0100減去一個1,也就是3(二進制的形式為0011),寫到這想必就能理解了,在取一個反不就正好隻把最右邊的兩位清0了,其他位不變,不正好就是我們要的式子嗎!!!别急,我們在想想為什麼要先減1,我們來看這個二進制0100,從二進制的加減法運算的角度來分析,0x0100 -1 是等于0x0011的,就是因為0x0100,隻有一個1的存在,其他為0了,0x0100在減1的時候,導緻1後面的其他位全為1,而全為1的個數正好在最右邊,而且正好為幂(此時的幂為2)的個數,你說巧不巧!!!比如要為double的整數倍,這裡sizeof(double) = 8 ,8的二進制為1000,減1為0111,取反1000,正好最右邊三個0,所以解決這個問題的關鍵就是m為2的幂次方也就是m = 2^x次方(x為整數),不然結論是不成立的。
所以((n m - 1)/m ) * m = ((n m - 1)>>x)<<x = (n m - 1) & ~(m - 1),((n m - 1)/m ) * m的物理意義就是sizeof(n)需要多少個sizeof(int)才能滿足,然後在乘以m表示總共需要的字節數(個數*字節數 = 總字節數),然後根據上面的等式就得到了(n m - 1) & ~(m - 1),也就是這個宏的由來了!!!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!