首頁 >常見問題 >char型別要佔幾個位元組

char型別要佔幾個位元組

青灯夜游
青灯夜游原創
2023-03-10 15:54:2136148瀏覽

char類型在C或C 中佔1個位元組,在java中佔2個位元組。 char用於C或C 中是定義字元型變數的,而char資料型別是整數型,只會佔據1個位元組。而在java中char類型佔2個位元組是因為Java編譯器預設使用Unicode編碼,因此2位元組(16位元)可以表示所有字元。

char型別要佔幾個位元組

本教學操作環境:windows7系統、Dell G3電腦。

我百度搜尋“char佔幾個位元組”,得到下面的答案:

char型別要佔幾個位元組

char用於C或C 中定義字元型變量,是整數類型,只佔一個位元組,取值範圍為-128 ~ 127(-27~27-1)。

char類型佔1字節,就是8位,所能儲存的正整數是 0111 1111,即127。

顯然這不是我們想要的結果,所以我繼續搜尋「java中的char佔幾個位元組」

char型別要佔幾個位元組

Java中的char用於存放字元的資料類型,佔用2個字節,採用unicode編碼,它的前128位元組編碼與ASCII相容,只不過有些字元需要兩個char來表示。

為什麼C或C 和java中的char佔用位元組數不相同?

有些字元需要兩個char來表示又是什麼意思?

編碼

在討論這個問題之前,我們先對部分知識點做普及。

首先我們都知道電腦儲存的資訊都是用二進制數表示的,那怎麼樣讓電腦儲存我們人類用的漢字或英文呢?

例如如何將'a'轉換為二進位儲存到計算機中,稱為編碼

而將儲存在計算機中的二進制數解析顯示出來,稱為解碼

字元集

字元(Character)是各種文字和符號的總稱,包括各國文字、標點符號、圖形符號、數字等。字元集(Character set)是多個字元的集合,字元集種類較多,每個字元集包含的字元個數不同,常見字元集名稱:ASCII字元集、GB2312字元集、BIG5字元集、 GB18030字元集、Unicode字符集等。這是百度百科給的解釋,反正就是字符集是一些字符的集合,字符集種類多,字符集中的字符數量也各不相同。電腦要準確的處理各種字元集文字,需要進行字元編碼,以便電腦能夠辨識和儲存各種文字。

unicode

它的名字叫統一碼, 也叫萬國碼,符號數量不斷增加,已超百萬 。

在創造Unicode之前,有數百種編碼系統。沒有一個編碼可以包含足夠的字元,從它的名字就可以看出這是一種所有符號的編碼,每一個符號都給予一個獨一無二的編碼,那麼各個不同編碼導致的亂碼問題就會消失。

大多數電腦採用ASCII碼(美國標準資訊交換碼),它是表示所有大小寫字母、數字、標點符號和控製字元的7位元編碼方案。統一碼(Unicode)包含ASCII碼,'\u0000'到'\u007F'對應全部128個ACSII字元。

不禁讓我感慨,有實力的人才能訂定標準。 Unicode 只是一個符號集,它只規定了符號的二進位代碼,僅僅提供字元與編號間映射,卻沒有規定這個二進位代碼應該如何儲存。我們知道英文字母的編號特別小,用一個位元組就完全能夠表示,而unicode中的中文符號的編號就很大了,一個位元組根本不行。於是後面出現了unicode字元儲存的多種實作方式,例如UTF-8,UTF-16等。 UTF-8 是一種在網路上使用最廣的一種 Unicode 的實作方式。

內碼和外碼

我們常說的java中的char佔幾個字節,應該是java中內碼中的char。

內碼是指java運行時,其char和string在記憶體中的編碼方式;外碼是程式與外部互動時外部使用的字元編碼,例如序列化技術。外碼可以理解為:只要不是內碼,就是外碼。要注意的是,原始程式碼編譯產生的目標程式碼檔案(執行檔或class檔案)中的編碼方式屬於外碼。 JVM中內碼採用UTF16。 UTF-16 的 16 指的是最小為 16 位元一個單元,也即兩個位元組為一個單元。早期,UTF16採用固定長度2位元組的方式編碼,兩個位元組可以表示65536種符號(其實真正能表示要比這個少),足以表示當時unicode中所有字元。但是隨著unicode中字符的增加,2個位元組無法表示所有的字符,UTF16採用了2位元組或4位元組的方式來完成編碼。 Java為因應這種情況,考慮到向前相容的要求,Java用一對char來表示那些需要4位元組的字元。所以,java中的char是佔用兩個字節,只不過有些字元需要兩個char來表示。這裡就解釋了為什麼有些字元需要兩個char來表示的問題。

另外:Java的class檔案採用UTF8來儲存字符,也就是說,class中字元佔1~6個位元組。 Java序列化時,字元也採用UTF8編碼,佔1~6個字元。

length()

那再來一個問題:Java中的一個字元的String.length()是多少?

看過前面的知識點不能再張嘴就來回答是1吧...... 寫個demo看一下:虎年就用虎來測試吧,tigerUTF對對應unicode編碼表示。

         String tiger = "?";
         String tigerUTF = "\uD83D\uDC05";
         System.out.println(tigerUTF);
         System.out.println(tiger.length()); 
         System.out.println(tiger.codePointCount(0,tiger.length()));

char型別要佔幾個位元組

可以得到呼叫String.length()得到的結果為2,表示的是stirng的char陣列佔UTF- 16格式的2個代碼單元(即4個位元組),而不是有多少個字元。當然我們想要取得多少個字符,可以使用codePointCount方法來取得。

更多相關知識,請造訪常見問題欄位!

以上是char型別要佔幾個位元組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn