Quelle est la différence entre unsigned long/longue/int en c/c++?
Il semble que tous les 4 octets de l'espace,
alors, quelle est la différence?
OriginalL'auteur user198729 | 2010-03-31
Vous devez vous connecter pour publier un commentaire.
Il semble que tous les 4 octets de l'espace,
alors, quelle est la différence?
OriginalL'auteur user198729 | 2010-03-31
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, la taille des int/long est indéterminé. Si votre compilateur, un
int
et unlong
peut-être la même, mais ce n'est pas universelle dans les compilateurs.Quant à la différence entre
unsigned long
etlong
:En supposant que 4 octets, un
long
a la plage de-2,147,483,648
à2,147,483,647
. Un unsigned long a la plage de0
à4,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épassement est garanti pour "envelopper."
Enrouler autour de est traité comme un dépassement de capacité arithmétique. Lorsque vous appuyez sur (dans rlbond exemple) 4294967296 dans un unsigned long, en ajoutant 1 "envelopper" et elle deviendra la valeur minimale: 0. L'ajout de 2 s'enroule autour, et d'en faire 1, etc.
Semble ce genre de trucs peut également être effectuée pour un type signé,non?
Il peut être, mais comme rlbond dit, le comportement est indéfini si vous débordement de type signé. Unsigned types sont garantis pour envelopper correctement; types signés ont pas cette garantie et le comportement pourrait changer d'une plateforme à l'autre.
4,294,967,296
devrait être4,294,967,295
à la fois dans la réponse et dans le commentaire de @Dan.OriginalL'auteur rlbond
Le langage C spécification permet la mise en œuvre de int et long types de varier d'une plateforme à une autre dans un délai de quelques contraintes. Cette variabilité est un casse-tête pour la croix-plate-forme de code, mais c'est aussi un atout car il permet la connaissance de programmeur pour équilibrer leurs objectifs de conception entre le maternelle la vitesse du processeur et de la pleine plage numérique sur des architectures matérielles, qui n'offrent pas les deux.
En général, "int" est censé carte une machine registre de la taille de la cible de l'architecture du PROCESSEUR de la machine, de sorte que les opérations de chargement, de stockage et d'exploitation sur l'int type de données devrait se traduire directement dans les opérations qui utilisent le processeur cible natif de registres.
Int peut être inférieure à la machine registre de taille dans l'intérêt de l'économie de l'espace mémoire (big ints prendre jusqu'à deux fois plus de RAM que peu ints). Il est fréquent de voir des int comme une application 32 bits entité, même sur les architectures 64 bits où la compatibilité avec les anciens systèmes et l'efficacité de mémoire sont des priorités.
"long" peut être de la même taille ou plus grand que "int" en fonction de l'architecture cible du registre tailles. Les opérations sur le "long" peut être mis en œuvre dans le logiciel si l'architecture cible ne prend pas en charge les valeurs que les grands dans sa patrie les registres de la machine.
Les processeurs conçus pour l'efficacité de la puissance ou les systèmes embarqués sont où vous trouverez les distinctions entre int et long de ces journées. Les compilateurs pour les Processeurs à usage général comme dans votre bureau ou votre ordinateur portable de façon générale, int et long, comme de la même taille parce que le PROCESSEUR utilise efficacement 32 bits des registres. Sur les petits appareils tels que les téléphones portables, le CPU minimal peut être construit pour gérer les 16 bits de données plus naturellement et doivent travailler dur pour gérer 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 à transférer les données de la puce, faible consommation d'énergie et la petite puce de la taille de la puce, tout ce qui rend pour un moindre coût (en $ et en watts) de l'appareil.
Dans une telle architecture, vous aurez plus de chances de trouver int de 16 bits taille et de temps pour être en 32 bits. Il peut aussi y avoir une perte de performance associés à l'utilisation de longs, causées soit par des états d'attente pour charger le 32 bits dans plusieurs lectures à travers un 16 bits du bus de données, ou causés par la mise en œuvre de longue opérations (addition, soustraction, etc) dans le logiciel si le natif de 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 assumer sur ints et qu'il désire, c'est que la gamme de l'int doit 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ù quelle que soit la relation que vous voyez actuellement entre int et long n'existe plus.
C'est pourquoi vous devez être prudent de garder entiers distincts de la nostalgie, même dans le quotidien banal de codage. Ils peuvent être complètement affectation compatible aujourd'hui parce que leurs détails de mise en œuvre de votre plate-forme matérielle coïncident, mais cette coïncidence n'est pas garanti sur toutes les plateformes.
OriginalL'auteur dthorpe
Bien, la différence entre
unsigned long
etlong
est simple: la limite supérieure. Signélong
va de (sur une moyenne de 32 bits) sur -2.1 milliards de dollars (-2^31) à +2,1 milliards d'euros (+2^31 - 1), tandis queunsigned long
va de 0 à 4,2 milliards de dollars (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++ n'a pas de déterminer le maximum de la largeur d'un de ces types, seulement minimum largeurs. Sur certains systèmes,int
est de 16 bits. Sur certains systèmes,long
est de 64 bits. Beaucoup de cela dépend de l'architecture du processeur qui sont ciblés, et de son mot de base est la taille de.L'en-tête
limits.h
existe pour définir la capacité maximale de différents types dans l'actuel environnement de compilation, etstdint.h
existe pour fournir de l'environnement types de garantie de la largeur, commeint32_t
.int
etlong
ont la même longueur -- le mot de base de la taille.Est ce que le droit?Non, pas du tout. Sur les anciens compilateurs 16 bits, int est généralement de 2 octets alors que pendant longtemps est de 4 octets. Il n'existe pas de règles strictes et rapides ici quand il s'agit de tailles, seulement ceux qui sont relatifs. char sera toujours inférieure ou égale à court, ce qui sera toujours plus petit que ou égal à int, qui sera toujours plus petite ou égale à la longue. Techniquement, vous pourrait obéir à la norme C++ et ont tous les quatre d'entre eux soit un octet.
Comment puis-je choisir un droit type de données lors de la définition est très vague...
Limites d'utilisation.h ou stdint.h pour vous aider. Si vous vous avez besoin d'une valeur de 32 bits, utilisez int32_t de stdint.h au lieu de int ou long. De cette façon, n'importe où vous le port de votre code, il va toujours être de 32 bits.
C Standard nécessite int pour être au moins de 16 bits et en long au moins 32 bits. Aujourd'hui, il ya stdint.h, cependant, qui définit les types comme int_fast16_t = un nombre entier signé de type qui est au moins de 16 bits (mais peut-être plus) et "rapide" sur la plate-forme cible (par exemple, il peut souvent être 32 bits sur les ordinateurs modernes). Ces types de doit être utilisé si vous avez des exigences particulières sur la taille. Voir stdint.h et les limites.h par exemple sur wikipédia.
OriginalL'auteur Dan Story