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