看算法時(shí),發(fā)現(xiàn)以下設(shè)置語(yǔ)句
int i = 0x80000000
// 二進(jìn)制表示為 10...0, ...表示省略中間的0或1
推測(cè)是負(fù)數(shù)最小值,可是觀察其二進(jìn)制表示,第一位是符號(hào)位,1表示負(fù)數(shù),那么上述的值就是 -0,很明顯不是這個(gè)含義。所以到網(wǎng)上查閱了一下,找到了這個(gè)答案。
轉(zhuǎn)載至 關(guān)于0x80000000為什么等于-2147483648和負(fù)數(shù)在內(nèi)存上儲(chǔ)存的問(wèn)題
1.負(fù)數(shù)在內(nèi)存中的存儲(chǔ)形式
- (1)十進(jìn)制負(fù)數(shù)以補(bǔ)碼存儲(chǔ)于內(nèi)存上
-8的在內(nèi)存上存儲(chǔ)形式: 1...1000
- (2)十六進(jìn)制負(fù)數(shù)以原碼存儲(chǔ)在內(nèi)存上
int i = 0x80000001
// i=-1在內(nèi)存上表示為 10...01
- (3)0x80000000的表示值
0x80000000的值為 -2^31
1后面的31位表示序號(hào)位,0...0【類似于數(shù)組中的0號(hào)位】,表示負(fù)數(shù)中的最小的一位。由于int的最小值為-2^31,排在負(fù)數(shù)從小到大的第0位,所以int i = 0x80000000 為 -(2^31)+ 0 = -2^31 - (4)十進(jìn)制的補(bǔ)碼也符合符號(hào)位+序號(hào)位的原則
以-1為例,其補(bǔ)碼為 1..1
11...1序號(hào)位為第2^31 -1位
所以其值為 -2^31 + 2^31 -1 = -1 符合預(yù)期
2.總結(jié)
花了半個(gè)小時(shí)整理別人的東西,也算小有收獲。符號(hào)位+序號(hào)位原則,序號(hào)位從0開始,序號(hào)位的值是多少就在最小值的基礎(chǔ)上加上多少。好像也是符合正數(shù)的情況~~~。
數(shù)值 = 該符號(hào)下最小值 + 序號(hào)位表示數(shù)
以上。