正32767的內(nèi)存映像是0111111111111111,,取反加1就是0000000000000001,加上MSB的負(fù)號,,于是-32767的內(nèi)存影響就是1000000000000001,,由于-32768 = -32767 - 1,所以-32768的內(nèi)存映像就是1000000000000000,。
C/C++標(biāo)準(zhǔn)支持1的補(bǔ)碼和2的補(bǔ)碼(還有一種叫符號數(shù)值表示法),,反碼就是1的補(bǔ)碼表示法,但1的補(bǔ)碼和符號數(shù)值表示法存在正0和負(fù)0,,這不符合現(xiàn)實(shí)世界的數(shù)值概念,,因此需要使用2的補(bǔ)碼,2的補(bǔ)碼實(shí)際上就是把1的補(bǔ)碼整個值域移動了一個數(shù)值位,,這樣就消除了負(fù)0,,本來表示負(fù)0的內(nèi)存映像現(xiàn)在被用來作為-INT_MAX使用了,所以2的補(bǔ)碼也是一種移碼。
可以這樣來想,, 因?yàn)槟阒镭?fù)一在機(jī)算是是用1111111111111111(十六個一)來表示的,, 在用這個-1來一直減1直到100000000000000里就已經(jīng)減了32767次了, 所以10000000000000000就是負(fù)的32768了,!這樣能理解嗎,?其實(shí)你也可以去想想為什么 計算機(jī)要用補(bǔ)碼來表示?因?yàn)檫@樣才能唯一的對應(yīng)一個數(shù),,就像0表示一樣,,不然就對應(yīng)兩個數(shù)了(000000000000000000和10000000000000000)為了區(qū)別所以1000000000000000就是-32768了。
|