2009-06-10 4 views
2

J'ai quelques anciens souvenirs de l'écriture de code C comme:Suffixe long et suffixe non signé requis lors de la déclaration de littéraux longs en C++?

long value = 0; 

dans les mauvais jours Win16 et se terminant avec value étant seulement une demi-initialisés: à savoir les 16 bits inférieurs étaient 0 et les 16 bits supérieurs étaient quels que soient les bits aléatoires à cet endroit en mémoire. En tant que tel, je me suis conditionné à écrire:

long value = 0L; 

Est-ce encore nécessaire en ce jour et l'âge en C99 et/ou C++? Je sais que ILP32 spécifie que int et long sont tous deux 32 bits, mais supposons que nous utilisons, par exemple, LP64 où int sont 32 bits et long s sont 64 bits. Les suffixes sont-ils requis ou est-ce que les formes modernes de C et C++ étendront implicitement les littéraux à la longueur de la variable à laquelle ils sont assignés?

Que diriez-vous des valeurs non signées? C'est à dire. Est-ce nécessaire?

unsigned long value = 0UL; 
+0

Copie possible de [quelle est la raison de la déclaration explicite de L ou UL pour les valeurs longues] (https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l- ou-ul-for-long-values) –

Répondre

7

Ils ne sont pas requis dans les exemples que vous avez donnés. Cependant, ils peuvent être nécessaires dans certaines circonstances quelque peu délicates. Par exemple, les éléments suivants peuvent produire des valeurs différentes:

sizeof(1) 
sizeof(1L) 
+0

Un simple non aurait fait. –

+5

@Martin: vraiment? Sûrement sur un site comme celui-ci, qui tente d'éduquer ses lecteurs, même une simple question oui/non nécessite quelques explications. –

+0

Exemples utilisant gcc -std = c99 32 bits: sizeof (1) == 4, mais sizeof (1LL) == 8 – Pete

3

Cela ne devrait plus être nécessaire. Le comportement que vous décrivez, s'il est visible dans le programme et pas seulement dans le débogueur, est un bug.

1

Puisque vous présumez un compilateur 32 bits, vous pouvez pas besoin L comme vous l'avez fait lorsque vous utilisez un compilateur 16 bits, mais vous pourriez avoir besoin LL, par exemple:

long long ll; 
ll = 1<<32; 

gcc std = c99 avertit "compte de décalage gauche> = largeur de type." Au lieu de cela, vous voulez:

ll = 1LL<<32; 

Voir aussi https://stackoverflow.com/a/8108658/782738, pour 11 C++ et références standard C99.

1

Mais cette notation est nécessaire pour les chaînes wchar_t, comme

L"I am a wchar_t string." 

et pour les longs entiers longs, trop ...

Je suppose que cela est quelque chose qui devrait être supprimé, il n'est pas utile (le type est déclaré avec son nom et pas avec un suffixe), mais toujours supporté en C++ 11.

Hm.

Questions connexes