2011-05-08 77 views
0

正如標題所暗示的,我不明白爲什麼它會是這樣。爲什麼不能將C常量存儲爲短類型

驗證碼:

#include <stdio.h> 
#define try 32 


int main(void) 
{ 

    printf("%ld\n" , sizeof try); 

    return 0; 

} 

問題:

1)當我嘗試使用sizeof接線員給存儲不斷try的大小存儲在,我得到4這是32位。

2),因爲它是大到足以容納它爲什麼不是C儲存於16位short

3)是否有使常量存儲在short類型的任何方式?

謝謝你閱讀我的問題,非常感謝。

+0

數值積分常數SANS後綴是INT:HTTP:// MSDN .microsoft.com/EN-US /庫/ 00a1awxf%28V = VS.80%29。aspx – Anycorn 2011-05-08 18:31:12

回答

2

聲明的常量可能是你在找什麼:

const short try = 32; 

這通常是首選,因爲我相信沒有優化(或者甚至用)編譯器不會嘗試,以適應任何數據類型轉換的最小數量的可尋址字節。

3

您誤解了C預處理器。 C預處理器只是執行字符串替換 - 它不知道類型。 '32'將根據適用於插入的上下文的語言規則進行解釋 - 通常爲int

爲了讓您定義的值總是被看作是一個短,你可以這樣做:

#define try ((short)32) 

參見:How do I write a short literal in C++?

+0

即使看起來很短,它仍然會在內存中佔用4個字節,對吧? – cost 2011-05-08 18:34:44

+0

取決於平臺。對於x86 Linux上的gcc,'printf(「%d \ n」,sizeof(try));'用我的表達式輸出'2'。 – 2011-05-08 18:40:14

0

我會採取裂縫在這一點,但我不能完全肯定如果我是正確的

由於指令#define只是告訴預處理器與你的號碼來代替嘗試,它的作用,如果它只是一個值。在特定的機器上,該值將被存儲在內存中的4個字節的空間中。我能想到的唯一解決方案就是使用一臺機器,該機器的體系結構使用默認的16位大小作爲int。

即使它很短,它仍然可能因爲對齊而佔用4個字節的內存,但這取決於它。

1

你所謂的常量定義,其實是一個宏定義,指出該標籤將嘗試通過在32預處理時間更換。

所以編譯器會理解它沒有指定任何類型的sizeof(32)。所以它得到了系統依賴的默認類型。

作一個簡短的常數,你將有要麼在定義宏來施放你的價值或初始化它作爲一個全球性像如下:

const short try = 32;