int的范围问题
32位的int 的范圍為 -2^31 ~ 2^31-1。以下討論的均是32位的有符號(hào)整數(shù),最高位為符號(hào)位。
int main(){
int s1 = 0x80000000;
int s2 = 0x7fffffff;
int s3 = 0xffffffff;
cout << "int最小值" << s1 << endl;
cout << "int最大值" << s2 << endl;
cout << "注意:" << s3<<endl;
system("pause");
}
求源碼的補(bǔ)碼為 :
(1)正數(shù)的補(bǔ)碼和原碼相同
(2)負(fù)數(shù)的補(bǔ)碼=保持最高的符號(hào)位不變,其余位取反+1
但是
int s1=0x 8000 0000和 int s1=8這種方式有所區(qū)別:
計(jì)算機(jī)中存的是補(bǔ)碼:
所以對(duì)于
int s1=8 這種方式,首先求8的補(bǔ)碼存儲(chǔ)到計(jì)算機(jī)中,然后輸出的時(shí)候再還原回來(lái)。
然而對(duì)于
in s1= 0x ffff ffff 計(jì)算機(jī)中直接存的就是 0x ffff ffff 并不需要求 0x ffff ffff的補(bǔ)碼,0x fffff ffff是以補(bǔ)碼的形式直接存儲(chǔ)到計(jì)算機(jī)中的。
因此對(duì)于
int s1= 0x ffff ffff,計(jì)算機(jī)中存儲(chǔ)的是 0x ffff ffff ,輸出的時(shí)候,需要將其還原回來(lái)
注意計(jì)算機(jī)存儲(chǔ)的是0x ffff ffff是以補(bǔ)碼的形式存儲(chǔ)的,因此輸出的是必須再還原回來(lái):
0x ffff ffff的補(bǔ)碼是 0x 8000 0001 ,最高位是符號(hào)位,因此輸出的是-1
int的最小值在計(jì)算機(jī)中存儲(chǔ)的為何存儲(chǔ)的是0x 8000 0000 呢?(注意最高位的符號(hào)位不參與運(yùn)算,相當(dāng)于標(biāo)志位)
因?yàn)?輸出的時(shí)候 對(duì) 0x 8000 0000 取補(bǔ)碼,注意最高位是符號(hào)位,不參與運(yùn)算, 因此對(duì)于剩下的31位, 0x 000 0000 取反加1后得到的是 0x 8000 0000
和最高位的符號(hào)位,加起來(lái)是 0x 1 8000 0000 溢出了,截取1位得到的是 0x 8000 0000 是-0 但是 已經(jīng)有0的存儲(chǔ)方式了,是0x 0000 0000不需要有-0這種的存儲(chǔ)方式,因此雖然截取掉了溢出的位,但是實(shí)際計(jì)算了最高位,這里是計(jì)算機(jī)為了表示更小的數(shù)做的特殊處理,因此實(shí)際上這里 表示的 是 0x 1 8000 0000而不是 0x 8000 0000,那 0x 1 8000 0000的最高位是 1表示負(fù)數(shù),0x 8000 0000 的值是 2^31,合起來(lái)表示的就是 -2^31.
總結(jié)
- 上一篇: 三菱plc选型手册_模拟量是什么?PLC
- 下一篇: vue 离开页面事件_【必看】58 道