1. 程式人生 > 實用技巧 >1 有符號與無符號

1 有符號與無符號

目錄

計算機中的符號位

  • 資料型別的最高位用於標識資料的符號

    • 最高位為1,表明這個數為負數
    • 最高位為0,表明這個數為正數
  • 有符號數的符號位

    #include <stdio.h>
    
    int main()
    {
        int sign = 0;  //符號位
    
        char i = -5;
        short j = 5;
        int k = -1;
    
        sign = i & 0x80;  //sign 不等於 0 : sign = (1011) & (1000 0000) 
        printf("sign = %d\n",sign);
    
        sign = j & 0x8000;  //sign 等於 0
        printf("sign = %d\n",sign);
    
        sign = k & 0x80000000;  //sign 不等於 0 : sign = (1111 1111 1111 1111 1111 1111 1111 1111) & (1000 0000 0000 0000 0000 0000 0000 0000) = 1000 0000 0000 0000 0000 0000 0000 0000
        printf("sign = %d\n",sign);
    
        return 0;
    }
    
    //輸出結果
    sign = 128
    sign = 0
    sign = -2147483648##
    

有符號數的表示法

  • 在計算機內部用補碼表示有符號數

    • 正數的補碼為正數本身

    • 負數的補碼為負數的絕對值各位取反後加1

    • 8位整數5的補碼為:0000 0101

      8位整數-7的補碼為:1111 1001

    • 16位整數20的補碼為:0000 0000 0001 0100

      16位整數-13的補碼為:1111 1111 1111 0011

無符號數的表示法

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

    • 無符號數預設為正數
    • 無符號數沒有符號位
  • 對於固定長度的無符號數

    • MAX_VALUE+1 -> MIN_VALUE
    • MIN_VALUE-1 -> MAX_VALUE

signed 和 unsigned

  • C語言中變數預設為有符號的型別

  • unsigned 關鍵字宣告變數為無符號型別

    • C語言中,只有整數型別能夠宣告 unsigned 變數
    #include <stdio.h>
    
    int main()
    {
        int i;  //預設為帶符號整型
        signed int j;  //顯式宣告變數為帶符號整型
        unsigned int k;  //宣告變數為無符號整型
    
        return 0;
    }
    
  • 當無符號數遇見有符號數

    • 當無符號數與有符號數混合計算時,會將有符號數轉換為無符號數後再進行計算,結果為無符號數

    • Demo1

      • 計算 i+j 時,先將 int 型變數 j 轉換為 unsigned int
      #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
      
    • Demo2

      • 無限迴圈下去,因為變數 i 的值一直是無符號數,不會出現小於 0 的情況
      #include <stdio.h>
      
      int main()
      {
       
          unsigned char i = 0;
          
          for(i=9; i>=0; i--)
          {
              printf("i = %u\n", i);
          }
          
          return 0;
      }