⑴ c語言中字元串所佔位元組數怎麼算
在純ASCII碼下,位元組數=字元串長度=字元個數,因為每個字元就一個位元組。
在Unicode下,位元組數/2=字元串長度=字元個數,因為每個字元都是2個位元組。
在ASCII碼與其它雙位元組字元系統混用時,位元組數=ASCII碼字元個數+雙位元組字元個數*2,
而此時字元串長度到底怎麼統計就不好說了,
【有的語言如C語言,此時字元串長度=位元組數,】
有的語言如JS,此時字元產長度=字元個數。
⑵ C語言中,位元組數怎樣算
\xff是轉義0xff,這個內容是2位元組。
如果作為字元串,還要有個0x0作結束符,實際需要佔用的內存是3位元組。
⑶ c語言,為什麼求位元組的運算符,用這個英文字母表示呢
您好,首先,這個運算符比其他的運算符特殊,是靜態運算符。如假設有變數a,則:sizeof(a++);不會改變a的值,因為它在編譯時就將值確定了。
其次,C語言是英文為母語的人開發並維護的,sizeof對他們來說,簡單易懂,且不長,所以就使用了這個名稱。
⑷ 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語言位運算中什麼是高位元組和低位元組
比如 :一個位元組=8bit計算機中用16表示一個數,比如0001 0001 1001 0001 ; 0001 0001就為高位元組,1001 0001為低位元組。 0001 0001 1001 0001B(或者1191H) 11H 91H說通俗點,就是把一個數用編碼表示出來(一般十六進制或二進制),左邊的一半數為高,右邊一半數為低
⑹ c語言怎樣計算所佔位元組
主要是看變數定義的類型;
char佔一個位元組,int佔四個位元組,float佔四個位元組,double佔8個位元組;
當要注意的是在字元串中要加個'\0',要多算一個位元組。
⑺ 急!C語言中字元與位元組怎麼算
字元是C語言中的一個術語,位元組是內存大小的一個單位;字元佔用內存空間的一個位元組;/0是一個字元。
⑻ C語言中按位運算和按位元組運算,怎麼理解這個抽象意思
舉個例子吧,
按位運算,比如數字4,二進制是00000100,
位運算,左移1位,二進制變成了00001000,變成8了,這就是位運算。
位元組運算,忘記了,網路下吧,很多的