2015-03-13 37 views
-3
#include<stdio.h> 
int main() 
{ 
    short i = 90L; 
    long j = 90; 
    printf("%d", sizeof(i)); 
    printf("%d\n", sizeof(j)); 
    return 0; 
} 

我剛剛讀到,如果我們把L放在一個整數值的末尾,那麼實際上它得到的存儲量等於long值,所以基本上這是什麼意思,這是因爲當我計算的大小這兩個變量都不一樣,如果它實際上佔據了一個長變量的大小,那麼顯然它會顯示大小爲4個字節,但它顯示的大小是根據短數據類型的大小隻有,所以背後的原因是什麼。爲什麼下面代碼中兩個變量的大小不同?

是價值trunctated,但當我priint我的價值,它打印它只有90,所以一切都如何發生。

+5

的類型*對象*的更多數據'i'是'short' - 不改變,無論大小您分配給它的值。 – 2015-03-13 18:10:03

+0

如果你是C新手,那麼你應該退後一步。它需要你一段時間,直到你找到一個你需要'sizeof'的例子。也許你的老師應該責怪給你錯誤的代碼示例。現在我可以告訴你,你應該避免使用「short」和「long」。如果變量的寬度很重要,使用'int8_t','int16_t','int32_t','int64'和它們的無符號對應值。 – kay 2015-03-13 18:21:33

+0

'sizeof'的結果是'size_t'類型。使用'「%zu」'而不是'「%d」'來打印它。 – 2015-03-13 18:21:44

回答

6
short i=90L; 

90L是類型爲long的常數。初始化將該值轉換爲short

long j=90; 

90int類型的一個常數。初始化將其轉換爲long

對象(變量)的大小與其當前值無關。這是它在內存中佔用的字節數。

+0

非常重要的是,'90L'沒有OP所暗示的存儲空間。它不駐留在任何數據段中,只作爲可執行代碼本身中的'mov'操作碼的一部分。 – Blindy 2015-03-13 19:00:19

+0

@ Blindy先生,你想說90L不佔用任何內存嗎? – 2015-03-15 04:44:03

+0

@RADHAGOGIA:沒有包含'long'值'90L'的C對象。在「抽象機器」中,值是以某種未指定的方式構造的,從「long」轉換爲「short」,轉換結果存儲在「i」中。在實踐中,編譯器幾乎肯定不會爲轉換而煩惱,並會生成代碼將值存儲在'i'中。它可能只存在於指令中,或者可能暫時存在於寄存器中。 – 2015-03-15 09:27:46

1

從C標準(6.5.3.4 sizeof運算和alignof運營商)

2 sizeof運算符產生它的操作數,這 可以是表達或的括號的名稱的大小(字節)一種。 尺寸 根據操作數的類型確定。

所以sizeof(short)對應於sizeof(i)小於sizeof(long)對應的sizeof(j)

編譯器無法容納比它分配給指定類型:)

+0

是的,我已經理解了,但仍然存在這樣的混淆:爲什麼90L沒有分配內存,如果沒有內存分配,那麼截斷過程如何發生? – 2015-03-19 13:03:31

+0

@RADHA GOGIA我還沒有理解SQL如何與您展示的代碼相關。 – 2015-03-19 13:33:51

相關問題