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?
Réponses:
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
int
peut 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 int
par taille. En outre, il existe une recommandation quiint
devrait représenter la capacité native du processeur .Tous les types sont signés. Le
unsigned
modificateur 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:
En Java , la spécification du langage Java détermine la représentation des types de données.
L'ordre est le suivant:
byte
8 bits,short
16 bits,int
32 bits,long
64 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
char
est large de 16 bits, non signé et contient des caractères utilisant le codage UTF-16 (cependant, il est possible d'attribuer unchar
entier arbitraire de 16 bits non signé qui représente un point de code de caractère non valide)la source
int
s non signés ...int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));
impressions2147483648
et des ombles est un type non signéInteger.MAX_VALUE + 1
est0x80000000
en 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 ainsi2147483648
. Merci pour lachar
note.char
n'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.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.
la source
**
n'est même pas C et n'est pas très clair à mon avis. :)^
car c'est habituellementxor
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
C
compilateur utilise des entiers 32 bits.la source
int
s'agit de la "largeur naturelle de la machine" que j'interpréterais comme 32 bits lors de la compilation pour des machines 32 bits.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'unint
doit avoir une largeur d' au moins 16 bits. Une mise en œuvre est libre de fournir unint
type 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
int
types 16 bits (All The World Is Not AVAXx86), mais il y en a beaucoup qui utilisent desint
types 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.
la source
INT_MIN
est spécifié comme-32767
. Ne présumez pas un complément à deux.L'équivalent strict de la java
int
estlong int
en C.Edit: Si
int32_t
est défini, alors c'est l'équivalent en termes de précision.long int
garantir la précision du javaint
, car il est garanti d'avoir une taille d'au moins 32 bits.la source
int32_t
s'il est défini par votre compilateurC'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).
la source
int
. Maislimits.h
aide à découvrir quelle est la vérité exacteL'affiche a leurs types java mélangés. en java, son C in est un court: court (16 bits) = -32768 à 32767 int (32 bits) = -2.147.483.648 à 2.147.483.647
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
la source
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
short
en32
bits, alors que sur une autre version Ubuntu 32 bits, il est en16
bits.la source
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.
la source
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.)Dans la plage C pour __int32 est –2147483648 à 2147483647. Voir ici pour les plages complètes.
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).
la source
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.
la source