Il semble que chacun d'entre eux prennent 4 octets d'espace,Quelle est la différence entre unsigned long/long/int en c/C++?
alors quelle est la différence?
Il semble que chacun d'entre eux prennent 4 octets d'espace,Quelle est la différence entre unsigned long/long/int en c/C++?
alors quelle est la différence?
Tout d'abord, la taille de int/long n'est pas spécifiée. Donc sur votre compilateur, un int
et un long
peuvent être les mêmes, mais ce n'est pas universel entre les compilateurs.
En ce qui concerne la différence entre unsigned long
et long
:
En supposant que 4 octets, un long
a la gamme de -2,147,483,648
-2,147,483,647
. Un long non signé a la plage de 0
à 4,294,967,295
.
Une autre différence est avec le débordement. Pour un type signé, un débordement a un comportement non spécifié. Mais pour un type non signé, le débordement est garanti de "boucler".
Eh bien, la différence entre unsigned long
et long
est simple - la limite supérieure. Signé long
va de (sur un système 32 bits moyen) environ -2,1 milliards (-2^31) à +2,1 milliards (+ 2^31 - 1), tandis que unsigned long
passe de 0 à 4,2 milliards (2^32 - 1).
Il arrive que sur de nombreux compilateurs et systèmes d'exploitation (y compris, apparemment, le vôtre), int
est également une valeur de 32 bits. Mais la norme C++ ne détermine pas les largeurs maximales pour aucun de ces types, seulement minimum largeurs. Sur certains systèmes, int
est de 16 bits. Sur certains systèmes, long
est de 64 bits. Cela dépend en grande partie de l'architecture du processeur ciblée et de la taille de son mot de base. L'en-tête limits.h
existe pour définir la capacité maximale des différents types dans l'environnement de compilation actuel et stdint.h
existe pour fournir des types de largeur garantie indépendants de l'environnement, tels que int32_t
.
Quel que soit le système, 'int' et' long' ont la même longueur - la taille du mot de base.Est-ce exact? – user198729
Non, pas du tout. Sur les anciens compilateurs 16 bits, int est généralement de 2 octets alors que long est de 4 octets. Il n'y a pas de règles strictes ici en ce qui concerne les tailles, seulement relatives. char sera toujours plus petit ou égal à court, qui sera toujours inférieur ou égal à int, qui sera toujours inférieur ou égal à long. Techniquement, vous pourriez obéir à la norme C++ et avoir tous les quatre d'un octet, cependant. –
Comment choisir un bon type de données lorsque la définition est trop vague ... – user198729
La spécification de langage C permet la mise en œuvre de types int et long pour varier d'une plate-forme à une autre dans quelques contraintes. Cette variabilité est un casse-tête pour le code multiplateforme, mais c'est aussi un atout car elle permet au programmeur informé d'équilibrer ses objectifs de conception entre la vitesse du processeur natif et la gamme numérique complète sur les architectures matérielles qui n'offrent pas les deux. En général, "int" est censé mapper une taille de registre machine de la machine de l'architecture CPU cible, de sorte que le chargement, le stockage et le fonctionnement sur les données int traduisent directement dans les opérations qui utilisent les registres natifs du processeur cible . La valeur Int peut être inférieure à la taille du registre de la machine afin d'économiser de l'espace mémoire (les gros caractères occupent deux fois plus de RAM que les petits nombres d'octets). Il est courant de voir int comme une entité 32 bits même sur des architectures 64 bits où la compatibilité avec les systèmes plus anciens et l'efficacité de la mémoire sont des priorités élevées. "Long" peut être de la même taille ou plus grand que "int" selon les tailles de registre de l'architecture cible
Les opérations sur «long» peuvent être implémentées dans un logiciel si l'architecture cible ne prend pas en charge des valeurs aussi grandes dans ses registres de machine natifs.
Les puces d'unité centrale conçues pour l'efficacité énergétique ou les dispositifs intégrés sont où vous trouverez des distinctions entre int et long ces jours.Les compilateurs pour les CPU à usage général, comme sur votre PC de bureau ou portable, traitent généralement int et long comme la même taille car le CPU utilise efficacement les registres 32 bits. Sur les appareils plus petits tels que les téléphones portables, le processeur peut être construit pour gérer les données 16 bits plus naturellement et doit travailler dur pour gérer les données de 32 bits ou plus. Moins de bits par registre signifie moins de circuits requis sur la puce, moins de lignes de données pour déplacer les données dans et hors de la puce, une consommation d'énergie plus faible et une plus petite taille de puce, tout ce qui fait pour un coût moindre (en $ et en $). en watts).
Dans une telle architecture, vous trouverez très probablement que la taille int est 16 bits et que la longueur doit être de 32 bits. Il peut également y avoir une pénalité de performance associée à l'utilisation de longs, provoquée par les états d'attente pour charger les 32 bits dans plusieurs lectures sur un bus de données de 16 bits, ou provoquée par l'implémentation de longues opérations (addition, soustraction, etc.) dans le logiciel. le matériel ne supporte pas de telles opérations dans le matériel.
En règle générale, la seule chose que vous pouvez supposer à propos des ints et des longs est que la plage de int doit toujours être inférieure ou égale à long sur n'importe quelle architecture. Vous devriez également supposer qu'un jour votre code sera recompilé pour une architecture différente où n'importe quelle relation que vous voyez actuellement entre int et long n'existe plus.
C'est pourquoi vous devriez faire attention à ne pas séparer les longs même dans le codage banal quotidien. Ils peuvent être totalement compatibles aujourd'hui car leurs détails de mise en œuvre pour votre plate-forme matérielle actuelle coïncident, mais cette coïncidence n'est pas garantie sur toutes les plates-formes.
Comment le * wrap around * est-il fait? – user198729
L'enroulement est géré comme une arithmétique de débordement. Quand vous frappez (dans l'exemple de rlbond) 4294967296 dans un long non signé, ajouter 1 va "enrouler autour" et il deviendra la valeur minimale: 0. L'ajout de 2 s'enroulera autour et fera 1, etc. –
Semble que ce genre de choses peut aussi être fait pour un type signé, non? – user198729