c語言中int是帶符號的32位數(shù),最高位為符號位酿傍,其余31位為數(shù)值位烙懦,最大的int值很好算,那就是符號位為0赤炒,其余31位全為1氯析,那么這個(gè)值就等于231-1,這個(gè)沒有異議莺褒。
那么int類型的最小值就比較繞了掩缓,因?yàn)檫@個(gè)值是一個(gè)負(fù)數(shù),而負(fù)數(shù)在計(jì)算機(jī)里是用補(bǔ)碼來表示的遵岩,也就是用負(fù)數(shù)的絕對值你辣,按位取反,再加1得到補(bǔ)碼尘执。
之前在網(wǎng)上找過很多文章舍哄,大都語焉不詳,自己驗(yàn)證了詳細(xì)的過程以后把心得寫下來誊锭。
補(bǔ)碼完整步驟:
- 確定負(fù)數(shù)的絕對值表悬,也就是一個(gè)正數(shù)
- 對這個(gè)正數(shù)寫成二進(jìn)制形式,并按位取反
- 加1得到補(bǔ)碼
用-1來舉例說明這個(gè)過程:
- 確定-1的絕對值丧靡,是1
- 寫成二進(jìn)制形式签孔,是000000000000.....1,取反后得到1111111111111......0
- 加1得到111111111111111......1
因此-1的補(bǔ)碼形式是32位全為1的數(shù)窘行,也就是0xFFFFFFFF
確定int類型的最小值的過程是上面過程的逆過程饥追,我們要把上面步驟反過來,先確定這個(gè)最小值的補(bǔ)碼罐盔,然后再確定對應(yīng)的十進(jìn)制是多少但绕。
注意負(fù)數(shù)的補(bǔ)碼可以直接參與運(yùn)算
還以上面-1的例子繼續(xù)舉例,我們先運(yùn)算-1-1=-2,然后看看倒推回去看看絕對值是不是2
- 對-1的補(bǔ)碼-1捏顺,得到111111111111111......0六孵,這就是-2的補(bǔ)碼
- 對這個(gè)補(bǔ)碼-1,得到111111111111111.....01
- 按位取反幅骄,得到0000000000000000......10劫窒,這正是-2的絕對值2
有了這些基礎(chǔ),現(xiàn)在我們就可以來確定int的最小值了拆座。我們先確定它的補(bǔ)碼形式主巍,既然是最小的int,也就是不能再-1了挪凑,再-1之后就會(huì)發(fā)生向更高的數(shù)值位借位的情況孕索,因此可以唯一確定補(bǔ)碼為1000000000000......0
最高為1,表示負(fù)數(shù)躏碳,后面31個(gè)數(shù)值位全為0搞旭,此時(shí)再-1就會(huì)發(fā)生向符號位更高位借位的情況,因此這就是最小值了菇绵。
現(xiàn)在來倒推去掉補(bǔ)碼之后的絕對值是多少:
- 對補(bǔ)碼-1肄渗,得到0111111111111111......1
- 按位取反,得到10000000000000......0
得到的二進(jìn)制位與補(bǔ)碼一樣咬最,這是一個(gè)巧合恳啥。
現(xiàn)在這個(gè)100000000000......0表示這個(gè)最小int的絕對值,也就是一個(gè)正數(shù)丹诀,因此最高為1不能再表示符號位了,那么絕對值是231翁垂,因此最小值是-231
由此得到32位有符號數(shù)的取值范圍為-231到231-1