Byte
- 長度:1byte/8bit
- 最大值:127 0b0111_1111
- 最小值:-128 0b1000_0000
Short
- 長度:2byte/16bit
- 最大值: 2^15 32767 0x7fff 0b0111_1111_1111_1111
- 最小值:-2^15 -32768 0x8000 0b1000_0000_0000_0000
Integer
- 長度:4byte/32bit
- 最大值: 2^31 -21億 0x7fffffff
- 最小值:-2^31 -21億 0x80000000
Long
- 長度:8byte/64bit
- 最大值: 2^63 約9*10^18
- 最小值:-2^63
關(guān)于單精浮點數(shù)和雙精浮點數(shù)結(jié)構(gòu)
根據(jù)IEEE754標(biāo)準(zhǔn),F(xiàn)loat和Double的計算公式
在單精度時:
V=(-1)^s*2^(E-127)*M
在雙精度時:
V=(-1)^s*2^(E-1023)*M
以float為例藕甩,float長度32位赊琳,位數(shù)從高到低
- 第1位為s符號位邮破,1為負(fù)值伸蚯,0為正值
- 第2-9位共8位為指數(shù)為E狡耻,取值范圍0255借浊,減去偏移量127后减宣,指數(shù)取值范圍-127-128界轩,其中取值0(全0)和255(全1)有特殊用途画饥,因此指數(shù)實際取值范圍-126127
- 剩余23位為小數(shù)位,表示24數(shù)字浊猾,省略了前導(dǎo)整數(shù)位1抖甘,即一般情況下M≥1.0
(對于Double,E為11位葫慎,M為52位)
當(dāng)指數(shù)位取值1衔彻,小數(shù)位取最小值時薇宠,即0x00800000,獲得float最小正標(biāo)準(zhǔn)值2^(-126)米奸。
關(guān)于最小正標(biāo)準(zhǔn)值與最小正值的區(qū)別昼接,摘抄一段stackoverflow中的回答:
For the single format, the difference between a normal number and a subnormal number is that the leading bit of the significand (the bit to left of the binary point) of a normal number is 1, whereas the leading bit of the significand of a subnormal number is 0. Single-format subnormal numbers were called single-format denormalized numbers in IEEE Standard 754.
也就是說,最小正標(biāo)準(zhǔn)值是保證小數(shù)位前導(dǎo)位為1的最小值悴晰。
非規(guī)格化表示:
當(dāng)指數(shù)位全0時慢睡,小數(shù)位前導(dǎo)整數(shù)位由1變?yōu)?,此時取值范圍:
2^(-126)*2^(-23) ~ 2^(-126)*(1-2^(-23))
此時的最小值也是float的正最小值铡溪,2^(-149)
特殊表示:
- 當(dāng)指數(shù)位和小數(shù)位全0時漂辐,表示0值,有+0和-0之分棕硫。
- 當(dāng)指數(shù)位全1髓涯,小數(shù)位不全0時,表示NaN哈扮。Java中用0x7fc00000表示NaN纬纪。
- 指數(shù)部分全1,小數(shù)部分全0滑肉,表示無窮大包各,Java中用0x7f800000表示正無窮大,0xff800000表示負(fù)無窮大靶庙。
關(guān)于+0和-0,《java語言規(guī)范》中說的很明確:
Positive zero and negative zero compare equal; thus the result of the expression 0.0==-0.0 is true and the result of 0.0>-0.0 is false. But other operations can distinguish positive and negative zero; for example, 1.0/0.0 has the value positive infinity, while the value of 1.0/-0.0 is negative infinity.
對于float類型的+0.0f與-0.0f
- +0.0 == -0.0
- +0.0 > -0.0 = false
- 1.0/+0.0 = 0x7f800000
- 1.0/-0.0 = 0xff800000
關(guān)于NaN问畅,同樣來自《java語言規(guī)范》:
NaN is unordered, so:
?The numerical comparison operators < , <= , > , and >= return false if either or both operands are NaN (§15.20.1).
? The equality operator == returns false if either operand is NaN.
In particular, (x<y) == !(x>=y) will be false if x or y is NaN.
? The inequality operator != returns true if either operand is NaN (§15.21.1).
In particular, x!=x is true if and only if x is NaN.
對于float值x,y六荒,如果 x,y至少一個為NaN护姆,那么 < , <= , > , >= ,== 都返回false。(x < y) == !(x >= y) 返回false掏击。
當(dāng)且僅當(dāng)x = NaN時卵皂,x!=x返回true。
綜合以上砚亭,可以得到float的正最小值為2^(-149)渐裂,即0x00000001,正最大值為0x7f7fffff钠惩,也即0x7fffffff-0x00000001(正無窮大-正最小值)
Float
- 長度:4byte/32bit
- 正最大值:0x7f7fffff柒凉,約3.4*10^38
- 正最小值:0x00000001,月1.4*10^(-45)
對于Float的equals方法篓跛,比較的是兩個float值的二進(jìn)制表示膝捞,因此+0.0f.equals(-0.0f)返回false,NaN.equals(NaN)返回true,這是FLoat與float不同的地方。
Double
- 長度:8byte/64bit
- 正最大值:1.8*10^308
- 正最小值:4.9*10^(-304)