簡體   English   中英

數據類型大小與sizeof(數據類型)之間的差異

[英]The difference between size of datatype and sizeof(data type)

我正在學習C ++並遇到以下問題。 我只是一個初學者,我感到困惑。 是不是sizeof()函數應該返回數據類型的大小? 為什么數據對象的大小與sizeof()不同? 我不明白答案的解釋。

假設在假設的機器中,char的大小是32位。 sizeof(char)會返回什么?

a)4

b)1

c)依賴於實施

d)機器依賴

答案:B

說明:標准不要求char為8位,但要求sizeof(char)返回1。

sizeof運算符以字節為單位生成類型的大小,其中一個字節被定義為char的大小。 因此,無論char在給定平台上有多少sizeof(char)始終是1。

這適用於C和C ++。


從C11標准, 6.5.3.4

  1. sizeof運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。 大小由操作數的類型決定....

然后,

  1. sizeof應用於具有charunsigned charsigned char (或其限定版本)類型的操作數時,結果為1。

從C ++ 11標准, 5.3.3

  1. sizeof運算符產生其操作數的對象表示中的字節數。 操作數是一個表達式,它是一個未評估的操作數(第5章),或帶括號的type-id .... ... sizeof(char)sizeof(signed char)sizeof(unsigned char)是1。

(強調我的)

按5.3.3 [expr.sizeof]

sizeof運算符產生其操作數的對象表示中的字節數。 操作數是表達式,它是未評估的操作數(第5條)或帶括號的type-id。 sizeof運算符不應該應用於具有函數或不完整類型的表達式,也不應用於在聲明所有枚舉數之前其基礎類型未修復的枚舉類型,此類型的帶括號的名稱,或指定為glvalue的glvalue。位字段。 sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1. [...]

強調我的

因此,無論char占用多少位,其大小始終為1

你只是混淆了字節八位字節之間的差異

一個字節是一個字符的大小。 這會產生始終為true sizeof(char) == 1 ,因為sizeof字節為單位返回大小

八位字節8位組成

在幾乎所有現代平台上,字節的大小恰好與八位字節相同。 這就是為什么將它們混合起來是一個常見的錯誤,甚至書籍作者和教授都這樣做。

sizeof(x)返回x的大小,以char的大小為單位表示。

沒有sizeof(char)為4的機器。它總是1個字節。 該字節可能包含32位,但就C編譯器而言,它只是一個字節。

“8位”的正確名稱是八位字節。 C標准使用單詞“byte”作為char的大小的對象。 其他人可能會以不同的方式使用“byte”這個詞,通常是指“octet”,但在C(和C ++,或Objective-C)中,它意味着“對象是char的大小”。 char可能超過8位,或多於一個八位字節,但它總是一個字節。

問題應該是 - 假設在一個假設的機器中, word size(size of registers)是32位。 sizeof(char)會返回什么?

答案是1 byte

在計算中,word是特定處理器設計所使用的自然數據單元的術語。 字是由指令集或處理器的硬件作為一個單元處理的固定大小的數據。 字中的位數(字長,字寬或字長)是任何特定處理器設計或計算機體系結構的重要特征。 - https://en.wikipedia.org/wiki/Word_%28computer_architecture%29

在你的情況下, word-size將是32位。

從歷史上看,字節是用於在計算機中編碼單個文本字符的位數,因此它是許多計算機體系結構中最小的可尋址存儲單元。 - https://en.wikipedia.org/wiki/Byte

1字節是存儲器的最小可尋址單元,它是8位,9位或16位硬件規格選擇的任何東西。

sizeof而言,它首先確定參數的類型,最終以字節為單位計算大小。 因此,遵循兩個C ++語句將產生相同的結果。

  int n;
  std::cout<<sizeof(int);
  std::cout<<sizeof(n);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM