long a2 = 100L * 1024 * 1024 * 1024;
In hierdie operasie is egter ten minste een operand long
. Die bewerking word dus met 64-bis-presisie uitgevoer, en die resultaat van die numeriese operateur is van tipe long
. Die ander nie-lange operand word uitgebrei om te tik long
per Numeriese promosie en die resultaatwaarde word na veranderlike gestoor a2
.
long a1 = 100 * 1024 * 1024 * 1024;
Die konstante uitdrukking van gewone heelgetal, die resultaat van die uitdrukking is as 'n tipe bereken int
. Die berekende waarde het egter te groot om in 'n heelgetal te pas en dus oorvol te wees, wat tot gevolg het 0
en word gestoor aan a1
veranderlike.
Wysig: Soos gevra word in die volgende opmerking:
Waarom gaan dit nie negatief nie?
Want terwyl hy in heelgetal berekening Die tweede berekening is gelykstaande aan 25 * 2^32
waar ^
het die krag betekenis en 2^32
heelgetalwaarde is 0
. Om egter te verduidelik waarom dit waarde is 0
: In binêre:
100 * 1024 * 1024 * 1024 == 25 * 2^32;
Integer.MAX_VALUE = 2 ^ 31 -1 = 0 11111111 11111111 11111111 1111111
Integer.MAX_VALUE + 1 = 2 ^ 31 = 1 00000000 00000000 00000000 0000000
2 ^ 31
is 'n negatiewe heelgetal (-2147483648
) soos die tekenstuk is 1
En vandaar 2 ^ 32
is net 'n vermenigvuldiging van 2
na 2 ^ 31
: 'n linkerskof en die bordjie sal word 0
En daarom is die resultaat 0
.
Kyk na die java language specification: 4.2.2: Integer operation
vir besonderhede.