計算機中的數之一 無符號數與有符號數

下一篇:計算機中的數(二)之原碼、補碼、反碼及其轉換

引言

學過C語言的,都知道 C語言中有有符號數和無符號數。用int舉例子也就是
int a;是定義了一個有符號數,而unsigned int a;是定義了一個無符號數。

正文

我們按32位編譯器來舉例子,int變量是4個字節。也就是32位二進制數。
那麼如果是無符號數,那麼根據16位二進制數可以表示2^32個狀態也就是
02^32-1這樣的範圍。(也就是04294967295)。我們編寫程序看下是不是這樣 的?

      #include <stdio.h>
  	#include <limits.h>
  	int main(void)
  	{
      printf("int 佔%d 字節\n",sizeof(int));
      printf("unsigned int 的範圍%u~%u",0, UINT_MAX);
      return 0;
  	}

運行結果

如果是有符號數,對於有符號數而言,符號的正負機器是無法識別的。但由於正負恰好是兩種截然不同的狀態,如果用0表示正,用1表示負,這樣符合也被數字化了。
所以因爲有符號數使用了一位二進制數來存儲符號,整體的存儲範圍也就比無符號數縮小了一倍範圍。

#include <stdio.h>
#include <limits.h>
int main(void)
{
   printf("int 佔%d 字節\n",sizeof(int));
   printf(" int 的範圍%d~%d",INT_MIN, INT_MAX);
   return 0;
}

運行結果
但可以看到負數比正數多了一位。這是和計算機存儲數字的碼制有關係。有四種碼:原碼,補碼,反碼,移碼。這裏負數多了一位和補碼存儲方式有關係。想要繼續瞭解可以點擊後續文章閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章