2

I have some ancient memories of writing C code like:

long value = 0;

in the bad old Win16 days and ending up with value being only half-initialized: i.e. the lower 16 bits were 0 and the upper 16 bits were whatever random bits were at that location in memory. As such, I became conditioned to write:

long value = 0L;

Is this still required in this day-and-age under C99 and/or C++? I know that ILP32 specifies that int and long are both 32-bit, but suppose we're using, say, LP64 where ints are 32-bits and longs are 64-bits. Are the suffixes required or will the modern forms of C and C++ implicitly extend literals to the length of the variable they're being assigned to?

How about unsigned values? I.e. is this required?

unsigned long value = 0UL;
David Citron
  • 43,219
  • 21
  • 62
  • 72
  • Possible duplicate of [what is the reason for explicitly declaring L or UL for long values](https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l-or-ul-for-long-values) – phuclv Dec 06 '17 at 16:14

4 Answers4

7

They are not required in the examples you gave. However, they may be needed in some somewhat recondite circumstances. For example, the following may produce different values:

sizeof(1)
sizeof(1L)
Ajay
  • 18,086
  • 12
  • 59
  • 105
  • 6
    @Martin: really? Surely on a website like this, which tries to educate its readers, even a simple yes/no question requires some explanation. – Steve Melnikoff Jun 10 '09 at 16:24
  • Examples using 32-bit gcc -std=c99: sizeof(1) == 4, but sizeof(1LL) == 8 – Pete Dec 05 '12 at 21:41
3

No this should not be required any more. The behavior you are describing, if visible in the program and not just the debugger, is a bug.

JaredPar
  • 733,204
  • 149
  • 1,241
  • 1,454
1

Since you are presuming a 32-bit compiler, you may not need L as you did when using a 16-bit compiler, but you could need LL, e.g.:

long long ll;
ll = 1<<32;

gcc -std=c99 warns "left shift count >= width of type." Instead, you'd want:

ll = 1LL<<32;

See also https://stackoverflow.com/a/8108658/782738, for C++11 and C99 standard references.

Community
  • 1
  • 1
Pete
  • 424
  • 4
  • 14
1

But this notation is required for wchar_t strings, like

L"I am a wchar_t string."

and for long long integers, too...

I guess this is something that should be removed, it isn't useful (the type is declared with its name and not with some suffix), but still supported in C++11.

Hm.