Comme d'autres l'ont mentionné, la norme du langage C définit le type d'une constante de caractère comme étant int
. La raison historique est que C, et son prédécesseur B, ont été développés à l'origine sur des mini-ordinateurs DEC PDP avec différentes tailles de mots, qui supportaient l'ASCII 8 bits mais ne pouvaient effectuer des opérations arithmétiques que sur des registres. Les premières versions de C définissaient int
pour être la taille de mot native de la machine, et toute valeur inférieure à un int
devait être élargi à int
afin d'être transmis à une fonction ou à partir d'une fonction, ou utilisé dans une expression logique, arithmétique ou par bit, car c'est ainsi que le matériel sous-jacent fonctionne.
C'est également la raison pour laquelle les règles de promotion des entiers stipulent toujours que tout type de données plus petit qu'un int
est promu à int
. Les implémentations C sont également autorisées à utiliser les mathématiques à complément à un au lieu de celles à complément à deux pour des raisons historiques similaires, et le fait que les échappements de caractères sont par défaut en octal et que les constantes octales commencent par juste 0
et les besoins hexagonaux \x
o 0x
est que les premiers mini-ordinateurs DEC avaient des tailles de mots divisibles en morceaux de trois octets, mais pas en morceaux de quatre octets.
Promotion automatique vers int
ne cause que des problèmes aujourd'hui. (Combien de programmeurs sont conscients que multiplier deux uint32_t
ensemble est un comportement non défini, parce que certaines implémentations définissent int
de 64 bits de large, le langage exige que tout type de rang inférieur à int
doit être promu à un signé int
le résultat de la multiplication de deux int
multiplicandes a le type int
la multiplication peut déborder un produit signé de 64 bits, ce qui constitue un comportement indéfini). Mais c'est la raison pour laquelle C et C++ sont coincés avec cela.
6 votes
Vous devriez utiliser
%zu
commesizeof
renvoie àsize_t
pasint
24 votes
Vous devez marquer ce code en C ou C++, car il donnera des réponses très différentes selon le langage. En fait, le C++ a reconnu que le C était stupide et a corrigé plusieurs défauts évidents du langage, alors que le C refuse d'admettre qu'il est stupide.
1 votes
@Sam Varshavchik Pas nécessairement un double car les deux premières lignes donneront 1 contre 4 en C, mais 1 contre 1 en C++. La troisième ligne va en effet s'amuser avec la promotion implicite en C++, mais pas en C.
7 votes
Interprétation bizarre du mot "duplicate" ici. J'ai rouvert. Le disque est bon marché. Les moteurs de recherche sont puissants. Ne fermons en tant que doublons que si c'est un doublon.
0 votes
Dans ce cas, peut-être que le question a besoin d'un vote positif.
9 votes
@Bathsheba "Le disque est bon marché" n'est pas une raison...
0 votes
@user202729 : A votre avis, avec respect. Quand on fait des recherches, il est toujours bon d'avoir une sélection de sources. Cette fermeture quichottesque à de larges prétendus doublons est la chose qui n'a aucun sens.
0 votes
Je peux trouver 3 cibles en double partiel, chacune répondant à une partie de la question. Je signale à la fermeture comme trop vaste .
6 votes
@user202729 Ce n'est pas trop large. Il pose une question très spécifique et concrète sur le génie logiciel. Et il ne semble pas y avoir de doublon exact.
0 votes
@Davislor Si elle peut être divisée en 3 questions différentes (chacune d'entre elles étant en rapport avec le sujet de l'enquête), il est possible d'y répondre. Stack Overflow ), c'est trop large.
0 votes
En outre, il n'a pas de doublon exact, précisément parce qu'il est trop large, dans ce cas.
0 votes
Je ne comprends pas pourquoi ce doublon. La réponse à cette question est "Parce que les littéraux des caractères C sont des ints". "Pourquoi les littéraux en caractères C sont des ints" est une question différente que je ne peux pas poser avant de savoir que les littéraux en caractères C sont des ints. N'est-ce pas ? La deuxième question implique que vous connaissez déjà la réponse à la première question. Mais ce n'est pas le cas.
0 votes
@kotlomoy J'ai beaucoup cherché avant de poser cette question. Je ne suis pas sûr de ce que deux utilisateurs ont ressenti avant de marquer cette question comme duplicate.