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