Ce n'est pas une question de <em>pratique recommandée</em> (ni de <em>comportement indéfini</em>), mais de ce que garantit réellement la norme <em>c++</em> en matière de conversion de tous les octets d'un type entier à la valeur de <code>(unsigned char)0</code>.
La ou les question(s)
Dans l'extrait ci-dessous, l'expression utilisée par la condition if est-elle garantie d'être évaluée à true en c++11 ?
std::memset (
reinterpret_cast (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
En consultant les citations de la norme C99 et C++11 (plus loin dans ce post), nous constatons que la norme C99 garantit explicitement qu'un type entier avec tous les bits définis à 0
représentera la valeur 0
dans ce type.
Je ne trouve pas cette garantie dans la norme C++11.
- N'y a-t-il pas une telle garantie ?
- Le résultat de l'extrait précédent est-il vraiment spécifique à l'implémentation ?
Dans C99 (ISO/IEC 9899:1999)
5.2.1.2/1 Caractères multioctets
Un octet avec tous les bits à zéro doit être interprété comme un caractère nul indépendamment de l'état de décalage. Un tel octet ne doit pas apparaître comme partie d'un autre caractère multioctet.
6.2.6.2/1 Types entiers
Les valeurs de tous les bits de remplissage sont non spécifiées. 45) Une représentation d'objet valide (non piégée) d'un type entier signé où le bit de signe est zéro est une représentation d'objet valide du type non signé correspondant, et doit représenter la même valeur.
Pour tout type entier, la représentation d'objet où tous les bits sont à zéro doit être une représentation de la valeur zéro dans ce type.
Dans C++11 (ISO/IEC 14882:2011)
2.3/3 Jeux de caractères [lex.charset]
L'ensemble de caractères d'exécution de base et l'ensemble de caractères larges d'exécution de base doivent contenir chacun tous les membres de l'ensemble de caractères source de base, ainsi que des caractères de contrôle représentant une alerte, un retour arrière et un retour chariot, plus un caractère nul (respectivement, caractère nul large), dont la représentation a tous les bits à zéro.