下一篇:計算機中的數(二)之原碼、補碼、反碼及其轉換
引言
學過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;
}
但可以看到負數比正數多了一位。這是和計算機存儲數字的碼制有關係。有四種碼:原碼,補碼,反碼,移碼。這裏負數多了一位和補碼存儲方式有關係。想要繼續瞭解可以點擊後續文章閱讀。