[英]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
sizeof
運算符產生其操作數的大小(以字節為單位),該操作數可以是表達式或類型的帶括號的名稱。 大小由操作數的類型決定....
然后,
- 當
sizeof
應用於具有char
,unsigned char
或signed char
(或其限定版本)類型的操作數時,結果為1。
從C ++ 11標准, 5.3.3
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.