valeur maximale de l'entier

291

En C, l'entier (pour une machine 32 bits) est de 32 bits, et il va de -32 768 à +32 767. En Java, l'entier (long) est également de 32 bits, mais varie de -2 147 483 648 à + 2 147 483 647.

Je ne comprends pas en quoi la plage est différente en Java, même si le nombre de bits est le même. Quelqu'un peut-il expliquer cela?

stackuser
la source
35
Pour obtenir les valeurs max et min de int en Java, utilisez Integer.MAX_VALUE et Integer.MIN_VALUE
live-love
5
@stackuser - Quelques bonnes réponses à votre question - vous devriez en accepter une :)
Darragh Enright
2
@DarraghEnright, il a été vu pour la dernière fois en mars 2015, je doute qu'il revienne :(
Ungeheuer
4
@Adrian haha ​​- Je suppose que non! Ça arrive un peu je suppose. J'ai toujours imaginé que SO pouvait facilement accepter automatiquement les réponses dans certaines conditions - lorsque la question dépasse un certain âge, l'OP est AWOL et il y a une réponse clairement utile avec un nombre élevé de votes positifs.
Darragh Enright
2
@DarraghEnright D'accord. Mais OP était ici il y a environ 2 semaines, il a eu la chance d'accepter, donc techniquement il n'est pas absent.
gaborsch

Réponses:

392

En C , le langage lui-même ne détermine pas la représentation de certains types de données. Il peut varier d'une machine à l'autre, sur les systèmes embarqués, il intpeut avoir une largeur de 16 bits, bien qu'il soit généralement de 32 bits.

La seule exigence est que short int<= int<= long intpar taille. En outre, il existe une recommandation qui intdevrait représenter la capacité native du processeur .

Tous les types sont signés. Le unsignedmodificateur vous permet d'utiliser le bit le plus élevé dans le cadre de la valeur (sinon il est réservé au bit de signe).

Voici un petit tableau des valeurs possibles pour les types de données possibles:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

En Java , la spécification du langage Java détermine la représentation des types de données.

L'ordre est le suivant: byte8 bits, short16 bits, int32 bits, long64 bits. Tous ces types sont signés , il n'y a pas de versions non signées. Cependant, les manipulations de bits traitent les nombres comme s'ils n'étaient pas signés (c'est-à-dire en gérant correctement tous les bits).

Le type de données de caractère charest large de 16 bits, non signé et contient des caractères utilisant le codage UTF-16 (cependant, il est possible d'attribuer un charentier arbitraire de 16 bits non signé qui représente un point de code de caractère non valide)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535
gaborsch
la source
10
La norme C spécifie également des valeurs minimales pour INT_MAX, LONG_MAX, etc.
Oliver Charlesworth
13
Java 8 a désormais également un entier non signé: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski
4
Merci, @jkbkot, bon de savoir ça. Bien qu'il semble que la représentation soit toujours signée, mais certaines opérations non signées sont implémentées en fonction. Il est difficile d'ajouter deux ints non signés ...
gaborsch
5
@GaborSch En Java, des int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));impressions 2147483648et des ombles est un type non signé
howlger
2
@howlger Integer.MAX_VALUE + 1est 0x80000000en hexadécimal, à cause du débordement (et est égal à Integer.MIN_VALUE). Si vous le convertissez en non signé (long), le bit de signe sera traité comme un bit de valeur, il en sera ainsi 2147483648. Merci pour la charnote. charn'est pas signé, vous avez raison, mais char n'est pas vraiment utilisé pour les calculs, c'est pourquoi je l'ai laissé dans la liste.
gaborsch
72

En C, l'entier (pour une machine 32 bits) est 32 bits et il va de -32768 à +32767.

Faux. Un entier signé 32 bits dans la représentation du complément à 2 a la plage -2 31 à 2 31 -1 qui est égale à -2 147 483 648 à 2 147 483 647.

Kos
la source
3
J'ai corrigé votre exponentiation, **n'est même pas C et n'est pas très clair à mon avis. :)
détendez-vous le
2
Ça a l'air mieux maintenant, merci! Trop de Python, je suppose. J'évite ^car c'est habituellementxor
Kos
5
Je pense que mon point est que puisque C n'a pas d'opérateur d'exponentiation, je ne pense pas que ce morceau particulier devrait être formaté en code du tout. :)
détendez-vous le
19

Un entier 32 bits va de -2 147 483 648 à 2 147 483 647. Cependant, le fait que vous soyez sur une machine 32 bits ne signifie pas que votre Ccompilateur utilise des entiers 32 bits.

Ivaylo Strandjev
la source
1
Au moins ma copie de M. Kernighan et M. Ritchies "Le langage de programmation C" dit dans A4.2 qu'il ints'agit de la "largeur naturelle de la machine" que j'interpréterais comme 32 bits lors de la compilation pour des machines 32 bits.
junix
7
Cela dépend du compilateur, pas de la machine je crois. J'ai eu un compilateur 16 bits installé sur ma machine 64 bits par exemple.
Ivaylo Strandjev
Bien sûr, votre compilateur 16 bits pour le code x86 16 bits n'utilisait que 16 bits. Mais ce n'était pas mon point. Même un processeur x86 32 bits fonctionnant en mode 16 bits n'a qu'une capacité native de seulement 16 bits. Mon point est que la plate-forme cible du compilateur a des problèmes. Par exemple, si vous avez un compilateur pour votre 80286, vous générerez toujours du code 16 bits et aurez donc des entiers 16 bits.
junix
2
@junix Je crois que c'est exactement ce que je souligne dans ma réponse. Ce n'est pas l'OS qui spécifie le nombre de bits de vos entiers. La plate-forme cible est une propriété du compilateur, pas du système d'exploitation sur lequel elle fonctionne ni du processeur dont vous disposez.
Ivaylo Strandjev
Comme je l'ai écrit dans mon premier commentaire. "C'est 32 bits lors de la compilation pour des machines 32 bits". L'OP écrit dans son message "l'entier (pour une machine 32 bits)" Donc, d'après ce que je comprends, il ne fait pas référence à son système d'exploitation ou à sa machine, il se réfère à sa plate
junix
15

La définition du langage C spécifie des plages minimales pour différents types de données. Pour int, cette plage minimale est comprise entre -32767 et 32767, ce qui signifie qu'un intdoit avoir une largeur d' au moins 16 bits. Une mise en œuvre est libre de fournir un inttype plus large avec une gamme correspondante plus large. Par exemple, sur le serveur de développement SLES 10 sur lequel je travaille, la plage est de -2147483647 à 2137483647.

Il existe encore des systèmes qui utilisent des inttypes 16 bits (All The World Is Not A VAX x86), mais il y en a beaucoup qui utilisent des inttypes 32 bits , et peut-être quelques-uns qui utilisent 64 bits.

Le langage C a été conçu pour fonctionner sur différentes architectures. Java a été conçu pour fonctionner sur une machine virtuelle qui cache ces différences architecturales.

John Bode
la source
Pour l'int 16 bits, il est -3276 8 à 32767. Pour l'int 32 bits, il est -214748364 8 à 2147483647. La plage est spécifiée de -2 ^ (n bits-1) à + 2 ^ (n bits-1 ) - 1.
mythicalcoder
3
@Maven: 5.2.4.2.1 - INT_MINest spécifié comme -32767. Ne présumez pas un complément à deux.
John Bode
8

L'équivalent strict de la java intest long inten C.

Edit: Si int32_test défini, alors c'est l'équivalent en termes de précision. long intgarantir la précision du java int, car il est garanti d'avoir une taille d'au moins 32 bits.

UmNyobe
la source
vous avez raison, l'équivalent est int32_ts'il est défini par votre compilateur
UmNyobe
7

C'est parce que dans C - entier sur une machine 32 bits ne signifie pas que 32 bits sont utilisés pour le stocker, il peut également être 16 bits. Cela dépend de la machine (dépend de l'implémentation).

BlueLettuce16
la source
1
Eh bien, il convient de noter que le comportement d'implémentation typique utilise "largeur de machine" pour int. Mais limits.haide à découvrir quelle est la vérité exacte
junix
3
Mais en réalité, je ne pense pas qu'un compilateur C pour 32 ait jamais été fait sans int en 32 bits. La norme peut permettre à l'implémentation du compilateur d'int d'être de nature moronique, mais pour une raison quelconque, personne ne veut faire un compilateur C moronique. La tendance est de faire des compilateurs C utiles.
Lundin
4

En fait , la taille en bits du int, short, long dépend de la mise en œuvre du compilateur.

Par exemple, sur mon Ubuntu 64 bits, je l'ai shorten 32bits, alors que sur une autre version Ubuntu 32 bits, il est en 16bits.

Alex
la source
2

C'est en fait très simple à comprendre, vous pouvez même le calculer avec la calculatrice google: vous avez 32 bits pour un int et les ordinateurs sont binaires, donc vous pouvez avoir 2 valeurs par bit (spot). si vous calculez 2 ^ 32, vous obtiendrez le 4 294 967 296. donc si vous divisez ce nombre par 2, (parce que la moitié d'entre eux sont des entiers négatifs et l'autre moitié sont positifs), vous obtenez 2 147 483 648. et ce nombre est le plus grand entier pouvant être représenté par 32 bits, bien que si vous faites attention, vous remarquerez que 2147483488 est supérieur à 2147483647 par 1, c'est parce que l'un des nombres représente 0, ce qui est malheureusement au milieu, malheureusement 2 ^ 32 n'est pas un nombre impair, vous n'avez donc pas un seul nombre au milieu, donc les entiers éventuels ont un chiffre de moins tandis que les négatifs obtiennent la moitié complète 2 147 483 648.

Et c'est tout. Cela dépend de la machine et non de la langue.

Emos Turi
la source
2
Ce n'est pas ce qu'il a demandé ... la question est "pourquoi C int est différent de Java int?"
ElectronWill
Et en Java, la taille de int ne dépend pas de la machine. int== 32 bits signés, le complément à deux est défini par la spécification du langage Java, et gravé sur des feuilles d' unobtainium anodisé . (OK, peut-être pas le dernier morceau.)
Stephen C
1

Dans la plage C pour __int32 est –2147483648 à 2147483647. Voir ici pour les plages complètes.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

Il n'y a aucune garantie qu'un «int» sera de 32 bits, si vous souhaitez utiliser des variables d'une taille spécifique, en particulier lors de l'écriture de code impliquant des manipulations de bits, vous devez utiliser les «types entiers standard».

En Java

Le type de données int est un entier complément à deux signé 32 bits. Il a une valeur minimale de -2 147 483 648 et une valeur maximale de 2 147 483 647 (inclus).

Achintya Jha
la source
2
Les valeurs que vous citez pour C ne sont que des plages minimales.
Oliver Charlesworth
@OliCharlesworth Range si du minimum au maximum.
Achintya Jha
6
Ce que je veux dire, c'est que la plage pour chaque type peut être plus grande que ce que vous avez cité ci-dessus.
Oliver Charlesworth
3
Il n'y a rien en C appelé __int32. Microsoft n'a pas de compilateur C strictement conforme, alors qui se soucie du fonctionnement de leur compilateur non-C? La seule source pertinente est ISO9899, ​​soit 5.2.4.2.1 "Tailles des types entiers" ou 7.20.2.1 "Limites des types entiers de largeur exacte". Aucun n'est compatible avec Microsoft goo.
Lundin
2
C99 ajoute int32_t, int16_t, etc., à la norme. Pas 100% compatible avec les ajouts de Microsoft, mais ils fonctionnent de manière similaire.
Renseignez-vous sur Monica
-1

en standard C, vous pouvez utiliser INT_MAX comme valeur maximale 'int', cette constante doit être définie dans "limits.h". Des constantes similaires sont définies pour d'autres types ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), comme indiqué, ces constantes dépendent de l'implémentation mais ont une valeur minimale en fonction des bits minimum pour chaque type, comme spécifié dans la norme.

Carlos UA
la source
5
Cela ne permet pas vraiment de répondre à la question du PO. De plus, les parties essentielles d'une réponse ne devraient vraiment pas être enterrées sur un autre site.
Brad Koch