2009-10-29 20 views
2

64如果我做的:ç定義在32位

#define TIMEFIXCONST 11644473600 

32位機器上,將它溢出或將它保存爲一個很長很長,仍然正常工作?我應該只是定義一個全局的無符號long long並使用它呢?

+1

如果你害怕溢出,我可以建議你使用後綴「L」嗎? – luiscubal 2009-10-29 18:56:33

+0

如果你需要很長的時間,正確的後綴是'LL',當然;一個'L'表示很長。這假定你有一個支持C99的編譯器。 – 2009-10-30 03:42:17

+0

'11644473600L'可能仍然是'long long'類型。但是不需要後綴;常數是可以保持其值的任何類型('int','long','long long')。 – 2015-11-27 12:17:23

回答

5

一個宏只是一個文本替換,你不能溢出一個宏。
這取決於您在以後分配TIMEFIXCONST的位置。

但是根據經驗,如果需要,使用常量時使用const intconst long long

0

如果將它存儲在int中,它將在x64和x86上溢出。如果您將它存儲在long中,那麼在任一平臺上都不會有問題。 #define對內存沒有影響。

+0

不能保證適合'long' - int是16位的最小值,'long'是32位的最小值(不同的x86和x86-64 ABI定義了這些不同的值)。 – caf 2009-10-29 20:31:19

1

A(非?)做這將是

#define TIMEFIXCONST 11644473600LL

然後,它會被視爲 「很長很長」 的標準方式。之後會發生什麼取決於你使用它的語句(溢出等)。如果您嘗試將其分配給32位變量,它將被截斷,編譯器應該發出警告。

+0

這是標準 - 只要標準是C99。如果標準是C89,則它是非標準的。 – 2009-10-30 03:42:48

3

該號碼不是「存儲」在任何地方。它只會插入到使用宏的程序源代碼中,就像直接寫入它一樣。但是如果你想字面本身是類型的很長很長,寫:

#define TIMEFIXCONST 11644473600LL 
0
#define TIMEFIXCONST 11644473600 

任何使用宏TIMEFIXCONST在編譯時擴展到固定11644473600。除非存儲它,否則它不會存儲在任何地方。

十進制整數常數爲int類型,long int,或long long int的,這取決於常數的值和類型的範圍(它是第一那些類型這是足夠寬以容納該值的)。沒有必要添加LLL後綴,除非您想明確說明類型。即使如此,11644473600L可能是long long而不是long

(在C89/C90,這是int類型,long int,或unsigned long int的,但如果unsigned long int是隻有32位的常數本身是一個錯誤。)

由於11644473600至少需要34比特(加上符號如果有的話),如果long是64位,則可能是long,否則就是long long

如果分配該值到int變量:

int n = TIMEFIXCONST; 

它會被轉換爲int,並且結果是實現定義的。你會大概得到編譯時警告;如果你不知道如何在你的編譯器中啓用更多的警告。