——關于int(4字節)的取值范圍由來(-2^31~2^31-1)問題?(送分篇,能者居之)
1.一個字節占8位,所以總共是32位,然后去掉第一位,也即符號位(1:負,0:正),也就剩下31位!
2.所以最小值為:-2^31,最大值為2^31,然后去掉0(0000....0000)也即2^31-1!
3.所以最后得出的范圍是:-2^31~2^31-1?。ㄕ龜档姆秶话?)
(是這樣么,求專業人士批評指正)
1.一個字節占8位,所以總共是32位,然后去掉第一位,也即符號位(1:負,0:正),也就剩下31位!
2.所以最小值為:-2^31,最大值為2^31,然后去掉0(0000....0000)也即2^31-1!
3.所以最后得出的范圍是:-2^31~2^31-1?。ㄕ龜档姆秶话?)
(是這樣么,求專業人士批評指正)
2015-02-28
舉報
2017-04-10
第三簡直錯的離譜
2017-04-10
https://wenku.baidu.com/view/d17dd4ba1a37f111f1855b10.html
2016-07-04
不錯不錯 看懂了
2015-06-26
謝謝!看懂了哦!講的不錯
2015-03-05
——關于int(4字節)的取值范圍由來(-2^31~2^31-1)?
1.【32位】一個字節占8位,所以4字節總共是占32位,然后去掉第一位,也即符號位(1:負,0:正),也就剩下31位!
2.【最大值:2^31-1】為什么不是2^31?
(1)假設只有三位,其中首位為符號位的話,最大值的情況不就是011嗎?也即表示3.
3 = 2^(3-1)-1.
(2)32位的時候同理,01111111 11111111 11111111 11111111 //而這個數表示的值就是2^31-1.
2^31-1 = 2^(32-1)-1.
3.【最小值:-2^31】為什么不是-(2^31-1)?
(1)因為數據是由二進制補碼存儲的:
1)當原碼為正數的時候,正數的原碼反碼補碼都相同,即00011的反碼也為00011,補碼也為00011.
2)當原碼為負數的時候,反碼即按位取反,比如10011為原碼,10011可表示-3,那么符號位不變,其余位按位取反即反碼11100.那么10011的補碼便是11101.
(2)所以可知int所取的最小值原碼為:11111111 11111111 11111111 11111111.
它的反碼為:10000000 00000000 00000000 00000000. (在原碼中表示-0.)
它的補碼為:10000000 00000000 00000000 00000001. (在原碼中表示-1.)
依次可以類推-2,-3,-4......-2^31!
【推到-2^31】
其原碼為10000000 00000000 00000000 00000001?
其反碼為11111111 11111111 11111111 11111110
其補碼為11111111 11111111 11111111 11111111
從上可知最小值只能表示到-2^31,而無法表示到更小的一位:-2^31-1!
4.【綜上所訴,int(4字節)范圍是:-2^31~2^31-1】!
(自己對于這個問題也糾結了很久,得出的結論若有不足之處,敬請批評指正,謝謝?。?/p>
2015-03-03
——【_wilsonjax的回答】
不是因為去掉0.。而是它本身的最大值就是2^31-1。而不是你說的2^31。
我們不考慮那么多位,假設只有三位,其中首位為符號位的話,最大值的情況不就是011嗎?32位的時候同理啊,
01111111 11111111 11111111 11111111 //而這個數表示的值就是(2^31)-1.
(支持的給個贊好么,哈哈)
2015-03-01
你理解的應該沒有什么問題。
通常的平臺上int型為32位,而且整型記法采用2的補碼,所以你的算法也沒錯。
2015-03-01
這個主要看你的編譯環境如果是c++編譯環境,int型占4個字節,如你所說正確,如果是單純的c編譯環境int型是占2個字節,因此最小值就為-2^15,最大值為2^15-1;你的思路是沒有錯的