c語言中位元組怎麼計算
㈠ 急!c語言中字元與位元組怎麼算
字元是C語言中的一個術語,位元組是內存大小的一個單位;字元佔用內存空間的一個位元組;/0是一個字元。
㈡ C語言中,位元組數怎樣算
\xff是轉義0xff,這個內容是2位元組。
如果作為字元串,還要有個0x0作結束符,實際需要佔用的內存是3位元組。
㈢ 我搞不懂C語言里的位元組怎麼算
一個位元組是8bit 32位 char是1位元組 short2位元組 int4位元組 double8位元組
㈣ c語言怎樣計算所佔位元組
主要是看變數定義的類型;
char佔一個位元組,int佔四個位元組,float佔四個位元組,double佔8個位元組;
當要注意的是在字元串中要加個'\0',要多算一個位元組。
㈤ c語言十六進制位元組計算
在vc中int是佔4個位元組
所以3個int
佔12個
在tc中int佔2個位元組
就佔6個
一般書上說的都是int
2位元組,long
int
4位元組,
vc
中int
和
long
int
都是4位元組
㈥ 急!C語言中字元與位元組怎麼算
一個英文字元佔用一個位元組(byte)的內存,\0是一個字元。一個位元組等於8位(bit)。
㈦ C語言中結構體位元組的計算方式
在說計算方式之前先講講幾個概念一個是 偏移量 還有一個是 內存對齊 。先說偏移量,網路對於它的定義是這樣:把存儲單元的實際地址與其所在段的段地址之間的距離稱為段內偏移,也稱為「有效地址或偏移量」。在結構體裡面大概是指結構體變數中成員的地址和結構體變數地址的差。然後再說一下內存對齊這個概念:內存中存放基本類型數據時,計算機的系統會對其位置有限制,系統會要求這些數據的首地址的值是某個數的倍數,而這個數被稱為該數據類型的對齊模數。雖然ANSI C標准中沒有強制規定相鄰聲明的變數內存中要相鄰,但是編譯器會自動幫你處理這個問題,也就是相鄰變數之間可能會填充一些位元組。因此在這個問題上又有了編譯器的區別。
那我們先來講講結構體變數在微軟的編譯器的對齊吧
1.結構成員的首地址要是其最寬的基本類型成員的整數倍。編譯器在給結構體分配內存的時候先找到最寬的基本成員,然後再在內存中尋找地址,並將這個最寬的基本數據類型的大小作為對齊模數
2.結構體每一個成員相對於首地址的偏移量是成員大小的整數倍,如果沒有達到這個要求,編譯器會自動填加位元組。編譯器在為結構體成員開辟內存的時候會先檢查開辟內存的首地址與結構體變數的首地址之間的偏移量,如果是成員體的整數倍那麼就存放這個變數,不然的話就在這個成員和上一個成員之間填充位元組,以達到整數倍的目的
3.結構體所佔的總內存大小要是最大成員體大小的整數倍,如果不是,那麼編譯器會在末尾補充位元組。結構體的最後一個成員,不僅要滿足前兩條原則,最後一條准則也要滿足。
接下來來看看幾個例子。
這個結構體在VS 2017下的sizeof的運算結果是12。那麼根據上面的對其規則我們來對其進行計算。
首先是char a。char大小是1,相對於首地址的偏移量是0,然後是int i。int i的大小是4,相對於首地址的偏移量是1,但是1不是4的整數倍,所以編譯器會自動在char a和int i之間填充位元組位元組。所以in i的偏移量是4。而之後的float b大小4偏移量就是int i的偏移量加上int i的大小故float b的偏移量大小就是8,而8正好是4的倍數那麼就不會有位元組填充。而結構體的大小也就自然是最後8+4=12了
從這里也可以看出結構體大小等於最後一個成員體的大小加上它的偏移量。
那麼我們再來看一個例子
那麼我們再利用之前的演算法來對其進行運算,int i的大小是4偏移量是0,int c 的大小是4偏移量是4,double b的大小是8,偏移量是8。char a的大小是1 ,偏移量是16。那麼這個結構體的變數的大小就是16+1=17嗎?答案肯定不是這樣的。在VS的sizeof的運算下這個的結果是24,為什是24呢,那麼這之前說的最後一條原則就要用上了。結構體的大小確實是等於最後一個成員的偏移量加上最後一個成員的大小,但是如果這個結構不滿足是結構體中最大成員大小的整數倍這個條件那麼,編譯器會自動在最後填充位元組使其滿足,也就是說,雖然我們計算出的結果是17但是17並不是8的倍數,所以編譯器自動在最後填充位元組使其成為8的倍數,即自動擴充成24.、
那我們再來說一下GCC編譯器下的模式。GCC編譯器在Windows環境下用的會比較少,主要在Linux平台下使用GCC編譯器就不遵守微軟的編譯器下的一些准則了,比如之前 說過的對齊模數。微軟的編譯器下的對齊模數是結構體成員中最大的大小而在GCC編譯器下對齊模數最大隻能是4。這就意味著對齊模數只能是1,2,4中的一個。因此之前講過的在微軟編譯器下的的一些原則會有些不同。之前講過的成員的首地址的偏移量要是成員大小的整數倍在這里就有點區別了。在GCC中如果成員大小小於等數4那麼繼續按照之前的標准就好了,但如果大於4,則結構體每個成員相對於結構體首地址的偏移量只能按照是4的整數倍來進行判斷是否添加填充。來看一個簡單的例子。
在這個例子中,如果是按照微軟的編譯器的話計算的結構應該是16,但是在GCC編譯器下是12。道理就是之前講的。
雖然理論上如此但是我自己在試的時候發現上面的運算結果是16,沒錯是16而不是12!為什麼呢?難道是這個理論錯了么,當然不是。我們可以嘗試在GCC下計算一下sizeof(int *)(是int *而不是int)。你會發現結果是8(如果是sizeof(int)那麼結果結果就是4),輸出結果是8那就解決了我們的疑惑。 64位系統的對其長度默認是8而32位的才是4 。這就合理解釋了為什麼計算結果是16而不是12。
對齊模數的選擇只能是基於基本數據類型,所以對於結構體嵌套結構體就不能這么,至於其的計算方式之後再補充
㈧ C語言中,如何計算有多少個位元組
27個,可以用strlen()函數來求(函數包含在string.h頭文件中)
㈨ C語言結構體所佔用的位元組數如何計算
結構體的數據類型的有點多我們就不啰嗦了,直接來看相同數據結構體的幾種書寫的格式吧。
格式一:
01.structtagPhone
02.{
03.charA;
04.intB;
05.shortC;
06.}Phone;
格式二:
01.structtagPhone
02.{
03.charA;
04.shortC;
05.intB;
06.}Phone2;
格式三:
01.structtagPhone3
02.{
03.charA;
04.charB[2];
05.charC[4];
06.}Phone3;
我們都知道,char類型佔用1個位元組,int型佔用4個位元組,short類型佔用2個位元組,long佔用8個,double佔用16個;
那麼我們可能會犯一個錯誤就是直接1+4+2=7,該結構體佔用7個位元組。這是錯的。
以下我們簡單分析下:
計算結構體大小時需要考慮其內存布局,結構體在內存中存放是按單元存放的,每個單元多大取決於結構體中最大基本類型的大小。
對格式一:
上面結構計算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小為結構體中個欄位大小之和,這也是最節省空間的一種寫法。
總結:
第一種寫法,空間浪費嚴重,sizeof 計算大小與預期不一致,但是保持了每個欄位的數據類型。這也是最常見的漫不經心的寫法,一般人很容易這樣寫;
第三種寫法,最節省空間的寫法,也是使用 sizeof 求大小與預期一樣的寫法,但是全部使用位元組類型,丟失了欄位本生的數據類型,不方便使用;
第二種寫法,介於第一種和第三種寫法之間,其空間上比較緊湊,同時又保持了結構體中欄位的數據類型。
只要了解是這些寫法的差異性,可以視情況選用。