Quelle est la différence entre non signé long/long/int en c/c++?

Il semble que tous les 4 octets de l'espace,

alors, quelle est la différence?

16
demandé sur user198729 2010-03-31 07:37:28

3 réponses

tout d'abord, la taille de int/long est indéterminée. Si votre compilateur, un int et long c'est peut-être la même chose, mais ce n'est pas universel pour tous les compilateurs.

comme pour la différence entre unsigned long et long:

en supposant 4 octets, a long a la plage de -2,147,483,6482,147,483,647. Un long non signé a une portée de04,294,967,295.

Une autre différence est à 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 à " envelopper."

23
répondu rlbond 2010-03-31 05:37:31

la spécification de langage C permet la mise en œuvre de types int et long pour varier d'une plate-forme à l'autre dans quelques contraintes. Cette variabilité est un casse-tête pour le code multiplate-forme, mais c'est aussi un atout car elle permet au programmeur averti d'équilibrer ses objectifs de conception entre la vitesse du processeur natif et la gamme numérique complète sur des architectures matérielles qui n'offrent pas les deux.

en général, "int" est censé cartographier une taille de registre machine de la cible La machine de L'architecture CPU, de sorte que le chargement, le stockage et l'exploitation des données de type int doivent se traduire directement en opérations qui utilisent les registres natifs du processeur cible.

Int peut être inférieur à la taille du registre de la machine dans le but d'économiser de l'espace mémoire (les gros ints prennent deux fois plus de RAM que les petits ints). Il est courant de voir l'int comme une entité 32 bits même sur des architectures 64 bits où la compatibilité avec des systèmes plus anciens et l'efficacité de la mémoire sont élevées priorité.

" 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 le logiciel si l'architecture cible ne supporte pas des valeurs aussi grandes dans ses registres machine natifs.

les puces CPU 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. Compilateurs pour les CPU à usage général comme dans votre ordinateur de bureau ou ordinateur portable généralement traiter int et long comme la même taille parce que le CPU utilise efficacement des registres 32 bits. Sur les appareils plus petits tels que les téléphones cellulaires le CPU peut être construit pour traiter des données 16 bits plus naturellement et doivent travailler dur pour traiter 32 bits ou plus de données.

moins de bits par registre signifie moins de circuits nécessaires sur la puce, moins de lignes de données pour déplacer les données à l'intérieur et à l'extérieur de la puce, moins de consommation d'énergie et plus petite taille de matrice de la puce, tout cela pour un coût moindre (en $ et en watts) appareil.

dans une telle architecture, vous trouverez probablement int à 16 bits de taille et long à 32 bits de taille. Il peut également y avoir une pénalité de performance associée à l'utilisation de longs, causée par les États d'attente pour charger les 32 bits dans les lectures multiples à travers un bus de données de 16 bits, ou causée par la mise en œuvre d'opérations longues (addition, soustraction, etc) dans le logiciel si le matériel natif ne supporte pas de telles opérations dans le matériel.

en règle générale, la seule ce que vous pouvez supposer sur les ints et les longs est que la gamme de int devrait toujours être inférieure ou égale à long sur n'importe quelle architecture. Vous devez également supposer qu'un jour votre code sera recompilé pour une architecture différente où quelque soit la relation que vous voyez actuellement entre int et long n'existe plus.

C'est pourquoi vous devez faire attention à garder les ints séparés des longs, même dans le codage banal quotidien. Ils peuvent être complètement compatible affectation aujourd'hui parce que leur détails de l'implémentation de votre plate-forme matérielle coïncident, mais cette coïncidence n'est pas garanti sur toutes les plateformes.

9
répondu dthorpe 2010-03-31 04:16:14

eh Bien, la différence entre unsigned long et long est simple: la limite supérieure. Signé long va de (sur un système de 32 bits en moyenne) environ -2,1 milliards (-2^31) à + 2,1 milliards (+2^31-1), tandis que unsigned long va de 0 à 4,2 milliards (2^32 - 1).

Il se trouve que sur beaucoup de compilateurs et systèmes d'exploitation (y compris, apparemment, la 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 visé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 indépendants de l'environnement de largeur garantie, tels que int32_t.

3
répondu Dan Story 2012-02-18 09:58:15