關於C有符號數數值溢出


#1 什么是溢出
當前計算機采用2補碼方式編碼數字,以8位為例,表達的全部數值范圍為 -128 -- 127。
正數符號位為0,負數符號位為1。
1000 0000表示 -128,快速計算方式是將其當作無符號數 128,然后減去 2^8, 全部過程為 128 - 256 = -128。
或者反碼后加一,同樣為 1000 0000 ,即128,當然是 -128。
溢出也就是數值逾越了當前數值表表達范圍。例如 138 不在 -128 -- 127范圍內。

#2 加法運算中的簡單補救措施
例如 120 + 121,120和121都是正常范圍內可以表達的數字,但其和 241 屬於溢出。
再如 -120 -121,結果同為溢出。
第一種情況的處理: 強制類型轉換為對應無符號數即可。
第二種情況的處理: 先使用neg指令,在輸出時在結果前加負號,可得正確結果。 neg  等效於先取反再加1

#3 如何判斷: 操作數同號 && 操作數與結果不同號

#4 范例與截圖

 1 #include <stdio.h>
 2 typedef signed  char INT8;
 3 
 4  int main(){
 5     INT8 m =  120;
 6     INT8 n =  121;
 7     INT8 r = m + n;
 8     printf( " %u\n ", (unsigned  char)r);
 9 
10     m = - 120;
11     n = - 121;
12     r = m + n;
13     _asm{
14         neg r
15     }
16     printf( " -%u\n ", (unsigned  char)r);
17 
18     getchar();
19      return  0;
20 }

結果:

241

-241


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM