2009-06-10 54 views
2

我寫的C代碼像一些古老的記憶:在惡劣的舊的Win16天在C++聲明較長的文字時,需要長期的後綴和無符號後綴?

long value = 0; 

value是隻有一半的初始化結束了:即低16位分別爲0高端16位分別爲無論隨機位在內存中的哪個位置。因此,我變得有條件地寫:

long value = 0L; 

這仍然需要在C99和/或C++這個日齡和年齡?我知道ILP32指定intlong都是32位的,但假設我們使用,也就是說,LP64其中int s爲32位和long s爲64位。是必需的後綴或將C和C的現代形式++文字含蓄地延伸到他們被賦予變量的長度?

如何無符號值?即這是必需的嗎?

unsigned long value = 0UL; 
+0

可能重複[爲長值顯式聲明L或UL的原因是什麼](https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l-或ul-for-long-values) – 2017-12-06 16:14:06

回答

7

在你給的例子中它們不是必需的。但是,它們可能在某種程度上的缺陷情況下需要。例如,以下可能產生不同的值:

sizeof(1) 
sizeof(1L) 
+0

一個簡單的否會做。 – 2009-06-10 15:47:28

3

不應該再需要這個了。您所描述的行爲(如果在程序中可見而不僅僅是調試器)是一個錯誤。

1

由於正在假定32位的編譯器,則可能無法按你沒有使用16位編譯時需要L,但你可以需要LL,例如:

long long ll; 
ll = 1<<32; 

GCC -std = C99警告「左移計數> =類型的寬度」。相反,你會想:

ll = 1LL<<32; 

https://stackoverflow.com/a/8108658/782738見C++ 11和C99標準的引用。

1

但需要這種符號的字符串爲wchar_t像

L"I am a wchar_t string." 

和long long整數,太...

我想這是應該被刪除,這是沒有用的(這個類型是用它的名字聲明的,而不是一些後綴),但是在C++ 11中仍然支持。

嗯。