c语言标准整形,C语言整形数值范围问题
有符號二進制數的表示是這樣的:如果計算機的字長為n位,n位二進制數的最高位為符號位。其余n-1位為數值位,采用補碼表示法時,可表示的數X的范圍是 -2的(n-1)次冪 <= X <= 2的(n-1)次冪-1。如果字長是16位,補碼表示的范圍就是 -2的15次冪 <= X <= 2的15次冪-1,也即可表示的范圍是-32768到32767。
計算機中二進制表示有原碼、反碼、補碼表示。
原碼是指將最高位作為符號位(0表示正,1表示負),其它數字位代表數值本身的絕對值的數字表示方式。
反碼表示規則為:如果是正數,則表示方法和原碼一樣;如果是負數,則保留符號位1,然后將這個數字的原碼按照每位取反,則得到這個數字的反碼表示形式。
補碼是計算機表示數據的一般方式,其規則為:如果是正數,則表示方法和原碼一樣;如果是負數,則將數字的反碼加上1(相當于將原碼數值位取反然后在最低位加1)。
所以正數的原碼、反碼、補碼是相同的,32767二進制原碼表示是0 111 1111 1111 1111,所以反碼、補碼表示都是0 111 1111 1111 1111;
由原碼定義可知十進制負數-32768在16位計算機中是表示不出來的,1111 1111 1111 1111表示的是-32767,但我們知道32768的原碼是1 000 0000 0000 0000,其反碼是0 111 1111 1111 1111,補碼是1 000 0000 0000 0000,由補碼定義可知恰好表示-32768。
兩個有符號數進行加減運算時,如果運算結果超過可表示的有符號數的范圍時,就會發生溢出,使計算機結果出錯。很顯然,溢出只能出現在兩個同號數相加或兩個異號數相減的情況。所以兩正數相加,結果超出了范圍,形式上變成了負數;兩負數相加,結果超出了范圍,形式上變成了正數(減法其實就是兩個負數相加)。
-1用補碼表示是1111 1111 1111 1111,即1000 0000 0000 0000 + 1111 1111 1111 1111時最高位有進位輸出時,發生了溢出,形成了0111 1111 1111 1111,這就是有符號十進制數32767的二進制表示法,結果當然是32767了。
。
全部
總結
以上是生活随笔為你收集整理的c语言标准整形,C语言整形数值范围问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flink checkpoint 恢复_
- 下一篇: java不要无限循环_java – 看