int
en type short
or byte
, les résultats sont inattendus ? Découvrons-le!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Résultat à l'écran :
-62
De manière inattendue, il existe une explication logique à cela : de plus, cette action peut être réalisée de vos propres mains. Pour ce faire, nous devons convertir 450 du décimal en binaire :
450/2. 0
225/2. 1
112/2. 0
56/2. 0
28/2. 0
14/2. 0
7/2. 1
3/2. 1
1/2. 1
Dans la colonne de droite du nombre, nous notons son reste lorsqu'il est divisé par 2, et sous le nombre lui-même, nous écrivons le résultat de la division de notre nombre par deux, si le reste est 0. Si le reste est 1, alors en dessous nous écrivons le partie entière issue de la division par deux. ( Calculatrice en ligne avec explication des calculs ). En conséquence, nous obtenons cela dans le système de nombres binaires 450 = 11100 0010
. Tout numéro de type int
occupe 4 octets ou 32 bits, chaque bit étant 0 ou 1. Dans notre cas, seuls 9 bits sont occupés, et en principe le nôtre int i = 450
en système binaire ressemble à ceci :
0000_0000_0000_0000_0000_0001_1100_0010
Nous voulons écrire notre variable dans une variable de type byte
, mais le numéro de type byte
prend 1 octet (comme le nom de ce type) ou 8 bits. Par conséquent, les bits supplémentaires à gauche sont simplement supprimés, et au final nous obtenons :
1100 0010
Plage de valeurs de type byte
: -128 à 127. Chaque nombre occupe 8 bits et le bit le plus à gauche de chaque nombre est le bit de signe. Pour tous les nombres positifs il est égal à 0, pour tous les nombres négatifs il est égal à 1. Il n'est pas nécessaire de se précipiter pour convertir notre résultat obtenu ci-dessus dans le 10ème système, car nous avons reçu un code supplémentaire pour le numéro souhaité, et non direct. Le bit le plus à gauche s'est avéré égal à 1, donc notre nombre est négatif, et pour les nombres négatifs, les codes directs et inverses ne coïncident pas, contrairement aux positifs. Si le bit de signe était égal à 0, alors nous pourrions immédiatement convertir le nombre en système de nombres décimaux et obtenir : 66. Mais le bit de signe est négatif, nous devons donc d'abord convertir le code supplémentaire en code direct et ajouter un moins signez à la réponse. Pour plus de clarté et de formation, essayons d'abord d'obtenir le code supplémentaire d'un numéro, par exemple -15. Pour ce faire, dans le code direct de sa représentation positive (numéro 15), vous devez changer tous les 0 en 1 et vice versa (obtenir le code inverse, également appelé inverse), puis en ajouter un au résultat. Dans le système décimal 15 = 0000 1111
; Code inversé (changer tous les 0 en 1 et vice versa) =1111 0000
; Code supplémentaire (ajoutez-en un) :
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Code supplémentaire pour le numéro -15 : 1111 0001
; Super. Maintenant, par analogie avec l'exemple ci-dessus, nous devons convertir notre code supplémentaire en code direct ; je vous rappelle qu'il est égal à 1100 0010
.
-
Soustrayez-en un et obtenez le code inverse. C'est pratique pour ce faire, notez un code supplémentaire dans la réponse et voyez à quoi vous devez en ajouter un pour obtenir un tel code supplémentaire. Nous commençons par le chiffre le plus à droite et regardons : à quoi devons-nous ajouter 1 pour obtenir 0 ? À 1, nous obtenons 10, 0 va en réponse et 1 va au chiffre suivant. Ensuite, ce qu'il faut ajouter à 0 pour en obtenir un. Un, mais puisque nous avons un un du chiffre précédent, nous écrivons en réponse 0. Ensuite, pour obtenir 0, que devons-nous ajouter à 0 ? Bien sûr, 0. Donc encore 4 fois. Et il reste les 2 derniers chiffres, où vous devez ajouter quelque chose à 0 pour obtenir 1. Bien sûr, dans les deux cas, vous devez ajouter 1. Total :
1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
-
Le plus dur est passé ! Nous avons reçu le code inverse (inverse) et il ne nous reste plus qu'à obtenir le code direct. Nous inversons tous les 0 en 1 et vice versa :
1100 0001
- code inversé ;0011 1110
- le code direct de notre numéro, ou plutôt sa représentation positive ; -
Convertir au système de nombres décimaux ( Calculatrice en ligne avec explication des calculs ) :
0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;
Il ne reste plus qu'à ajouter un moins au nombre et notre réponse :
-62.
short
en type int
:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
-
10 000 000 dans le 10ème système numérique =
0000 0000 1001 1000 1001 0110 1000 0000
dans le 2ème système numérique.En Java, un numéro de type
int
prend 4 octets, et unshort
numéro de type prend 2 octets, soit 16 bits, nous avons donc coupé la gauche à 16 chiffres : -
Traduisons-le en code inversé :
1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0
Code de retour:
1001 0110 0111 1111
; -
On inverse et on obtient le code direct :
0110 1001 1000 0000
. -
Nous convertissons au système de nombres binaires et obtenons une représentation positive de notre nombre :
1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
-
Ajoutez un moins et obtenez la réponse :
-27008
1001 0110 1000 0000
. Le bit le plus à gauche (le bit le plus significatif, également appelé bit de signe) s'est avéré être égal à 1. Cela signifie que nous avons un code supplémentaire pour un nombre négatif, nous passons donc au point suivant.
GO TO FULL VERSION