【C】 2_有符號與無符號

計算機中的符號位


  • 最高位1, 代表這個數爲負數
  • 最高位0, 標識這個數爲正數
int sign = 0;

char i = -5;
short j = 5;
int k = -1;

sign = (i & 0x80);        // sign 不等於0
sign = (j & 0x8000);      // sign 等於0
sign = (k & 0x80000000);  // sign 不等於0

編程實驗:有符號數的符號位

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;
    
    printf("%d\n", ((c & 0x80) != 0));
    printf("%d\n", ((s & 0x8000) != 0));
    printf("%d\n", ((i & 0x80000000) != 0));
}
輸出:
1
0
1

有符號的表示法


  • 在計算機內部使用補碼錶示有符號數編程

    • 正數的補碼爲正數自己
    • 負數的補碼爲負數的絕對值各位取反後加 1

圖片描述

無符號數的表示法


  • 在計算機內部用原碼錶示無符號數spa

    • 無符號數默認爲正數
    • 無符號數沒有符號位
  • 對於固定長度的無符號數code

    • MAX_VALUE + 1 => MIN_VAL
    • MIN_VALUE - 1 => MAX_VAL

signed 和 unsigned


  • C 語言中變量默認爲有符號的類型
  • unsigned 關鍵字聲明變量爲無符號類型
#include <stdio.h>
int main()
{
    int i;            // 默認爲帶符號整形
    signed int j;     // 顯示聲明爲帶符號整形
    unsigned int k;   // 聲明變量爲無符號整形
}

C語言中只有整數類型可以聲明 unsigned 變量圖片

實例分析:當無符號數碰見有符號數

#include <stdio.h>

int main()
{
     unsigned int i = 5;
     int j = -10;
     
     if( (i + j) > 0 )
     {
         printf("i + j > 0\n");
     }
     else
     {
         printf("i + j <= 0\n");
     }
     
     return 0;
}
輸出:
`i + j > 0`

分析:這不是咱們的指望, (-10 + 5) 應該是小於 0 的,爲何是這樣的輸出呢?
當無符號數與有符號數混合計算時,會將有符號數轉換爲無符號數後進行計算,結果爲無符號數。

實例分析:錯誤的使用了 unsigned

#include <stdio.h>
int main()
{
     unsigned int i = 0;
     
     for(i=9; i>=0; i--)
     {
         printf("i = %u\n", i);
     }
     
     return 0;
}
輸出:
i = 4294934822
i = 4294934821
i = 4294934820
......

分析:i 爲無符號數,所以 (i >= 0) 永遠成立。

小結


  • 有符號數用補碼錶示it

    • 正數的符號位爲0
    • 負數的符號位爲1
  • 無符號數用原碼錶示io

    • 無符號數沒有符號位
    • 無符號數只能用於表示正數
  • unsigned 只能修飾整數類型的變量

以上內容參考狄泰軟件學院系列課程,請你們保護原創!class

相關文章
相關標籤/搜索