新四季網

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),也就是這個宏的由來了!!!

,
同类文章
你想燒香和崇拜佛嗎?

你想燒香和崇拜佛嗎?

雖然人們聽說過他們的手,但每個人都真的明白有很多人。手有歷史悠久的歷史,而這個過程的發展過程也更加艱難,對我們進行思考是非常重要的,因為人們可以看到自己的命運
生命線分支分叉20種圖,即新分叉更困難

生命線分支分叉20種圖,即新分叉更困難

手掌中有許多線條,這些線條不同。而不同類型的手蛤與它的含義不同。事實上,手的類型非常多。一般來說,我們明白我們必須知道屬於自己的一隻手,你可以了解自己的命運
女人手在川志紋理,四川條紋,一個女人有一個強大的

女人手在川志紋理,四川條紋,一個女人有一個強大的

四川鑲邊這隻手是以相同的方式,而手不同,它代表的意義是不同的。男女的結果也有這樣的手階段也不同。當然,雖然手可以看到我們的命運,但我們將在一生中生命
有一種手工製作的飢餓,汞極為開發。

有一種手工製作的飢餓,汞極為開發。

對於一些更好的人來說,他們很容易賺錢,可能會突然有一天,他們的生活會有意想不到的財富,這種意外的財富可以讓你更好地生活。但是,沒有人能擁有如此美好的生活
智能線條突然扭轉了智慧。

智能線條突然扭轉了智慧。

事實上,大多數人都不知道如何改變他們的手,因為我們的手會改變,這也改變了我們的命運。我們的一隻手會改變。這隻手代表著我們一天的命運
WISDOM線條被破壞,但佈線很難發展

WISDOM線條被破壞,但佈線很難發展

我相信大多數人沒有仔細理解握手,但每個人都必須聽到它,但手有一個漫長的歷史,但還有很多人都不知道。事實上,注意你的手。好處,因為它代表著我們的命運
6種面部男人注定要在窮人的窮人中有一個典型的可憐的臉

6種面部男人注定要在窮人的窮人中有一個典型的可憐的臉

臉是一個非常神奇的東西,因為我們可以通過它看到一個人的命運。許多人對自己的命運非常好奇,所以他們會去手和自己的出生和八個角色,看看他們的命運
女人臉,大,全圖,長期以來,已久期待著

女人臉,大,全圖,長期以來,已久期待著

每個人都可能有一個長的痰液和身體部位的不同位置,而不同地點的代表的含義也是不同的。最明顯的是最常見的是人臉上的痣。在我們臉上有很多職位
掌心掌心手掌的手掌手掌手掌的女人?

掌心掌心手掌的手掌手掌手掌的女人?

不同的雙手有不同的財富,有些可能具有平穩的水流,有些可能是粗糙的壽命。在性質中,手相對發展一個人未來的財富。如果一個女人真的有一隻手掌,那麼未來會發生什麼
一個男人可以在右手結婚嗎?

一個男人可以在右手結婚嗎?

對於女孩來說,嫁給是生活中最重要的事情,他們看不到。有些人不能結婚。如果你結婚,他們的婚姻生活不會幸福。人們,人們,你可以擁有幸福的婚姻生活