2009-06-10 23 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中仍然支持。

嗯。