1. 程式人生 > >C語言進階——有符號與無符號02

C語言進階——有符號與無符號02

開始 有符號 分析 ack 方式 pri 位運算 運算 pan

在計算機的內部,我們所有的信息都是由二進制數字組成的

有符號數的表實法:

  • 在計算機內部用補碼的方式表實有符號數
  • 正數的補碼位正數的本身
  • 負數的補碼為其絕對值取反然後加一得到

例如-7 他在計算機內部的是1111 1001 是這樣得到的 7-》111-》0000 0111-》1111 1000-》1111 1001

無符號整數的表示:

  • 在計算機內部用原碼表實無符號整數
  • 無符號整數默認為正數
  • 無符號整數沒有符號位

對於固定長度的無符號整數:

  • max+1=min
  • min-1=max

C語言中默認為有符號類型,可以通過unsigned來聲明無符號類型的整數,特別註意,只有整數可以聲明為無符號整數,浮點數沒有無符號類型

代碼示例1:

#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 ));
    
    return 0;
}

這裏面可以通過與(位運算)來實驗最高位是0還是1

代碼示例2:

#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; }

這段代碼我們應該仔細分析一下,-10+5應該是個負數,可是為什莫會打印 i+j>0。因為在計算無符號和有符號類型做運算時,計算機會把有符號轉化為無符號然後才開始進行計算

示例代碼3:

#include <stdio.h>

int
main() { unsigned int i = 0; for(i=9; i>=0; i--) { printf("i = %u\n", i); } return 0; }

這段代碼錯誤的使用了無符號類型,導致不會退出循環,因為無符號類型你0-1後又是一個很大的正數

dfsaf

C語言進階——有符號與無符號02