2014-02-11 61 views
6

我目前正在編寫一個涉及處理字節的C程序。說到字節,我對以下問題感到困惑。如何在內存中存儲不同類型

  1. 字符是否以ASCII碼存儲在內存中?說'A'有anscii代碼65.那麼它以與整數65相同的方式存儲在內存中?

  2. 如果是這樣,機器如何區分字符和整數?

  3. 如果字符以ascii碼存儲,則ascii碼是一個整數。一個整數應至少佔用2個字節,一個字符如何才佔用1個字節?

  4. 最後一個是關於不同架構上的整數。在16位機器上,如果1被存儲爲000 ... 0001,那麼在32位機器上,1仍然以同樣的方式存儲,只是在前面添加0?

+0

該機器_doesn't_區分不同類型。 C++編譯器可以。 – ApproachingDarknessFish

+0

@ValekHalfHeart編譯器是否通過聲明類型來區分差異? – Xufeng

+0

是的,這就是申報類型。 – ApproachingDarknessFish

回答

9

存儲在內存中的字符通過它們的ASCII碼?說'A'有 anscii代碼65.所以它存儲在內存中的方式與整數65相同?

是的,但在C char是單字節,而一個int取決於機器架構。

如果是這樣,機器如何區分字符和整數?

機器代碼並不在乎內存中的字節代表什麼。編譯器的工作就是將你的代碼轉換成你的程序所做的機器指令。

如果字符以ascii碼存儲,則ascii碼是整數。 一個整數至少要佔用2個字節,一個字符如何只佔用1個字節?

ASCII可以適合單個字節(其大小爲char)。處理非ASCII文本在C中更加複雜。有wchar_t這是不可移植的,許多人認爲它已損壞。 C11介紹了char16_tchar32_t,它們可以分別用於UTF-16和UTF-32。

最後一個是關於不同架構上的整數。在16位的 機器上,如果1被存儲爲000 ... 0001,那麼在32位機器上,是否仍然以同樣的方式存儲1 只需在前面添加0?

這大部分是正確的,但它也取決於體系結構的endianness

+0

比我正在寫的更好的措辭。 – keshlam

+0

所以當存儲'A'和65時,區別在於前面的0的65是否被放入'A'? – Xufeng

+1

'char a ='A''和'char a = 65'絕對沒有區別。如果你問'int a = 65',那麼是的,它有額外的0。 – imgx64

3
  1. 是的,ASCII字符按其值存儲。但是存儲'A'(65 = 0x41)可能與存儲65本身不同,並且它如何完成取決於您的機器體系結構。一個char可以存儲一個字節,而一個int將至少有2個字節(在現代機器中通常是4個字節),所以這些可以以不同的方式存儲。

  2. 它沒有。我們可以擁有等於0x41的內存。區分'A'和65的唯一方法是基於你如何向編譯器聲明它。換句話說,如果你將該變量聲明爲一個int,它將被視爲一個int。

  3. 有這麼幾個ASCII值,你可以用小於8位表示所有的可能性。因此,使用16位來表示這將浪費內存。在當今的系統中,這不再是一個大問題,但是在內存有限的系統上,您可能希望將該額外的字節用於其他內容而不是浪費的空間。

  4. 或多或少,是的。 1將始終保存爲0000 .... 1,因此,其中的二進制數字的總數等於填充int的空間。所以在一個8位的系統中,將會是一個00000000和一個00000001的兩個字,在一個字上將是000000000000001的16位系統。