整形包括字符、短整形、整形、長整形,整形的存儲方式都是一樣的,整形在存儲時都是以補碼進行存儲的。
下面用char來解釋:
signed char -128 到127
unsigned char 0 到 255
short int -32768 到32797
unsigned short int 0 到65535
Char
Char類型其實也是一種整形,因為char的每個字符都是由0到255的整形數字來表示的;
ANSI C提供了char、signed char和unsigned char三種字符類型;
它們都是按照一個字節存儲的,可以保存256個不同的值;
unsigned char無符號的整形存儲簡單,因為正整數的原反補碼相等,范圍是0到255,直接存入相應的二進制。
signed char 的取值范圍在-128到+127,為什么在這個范圍呢?
計算機在存儲數據都是以數據的補碼來進行存儲,有符號類型存儲是,最高被當做符號位,0正1負,所以signed char取值范圍在
-(2^7)-1到+(2^7)-1,但是發現這個值是-127到+127,這是因為+0和-0被計算了兩次,但實際情況0只有一個,計算機一般把+0當做零,把-0當做-128,所以signed char 的取值范圍是-128到+127;
這里計算機是怎樣把-0識別為-128?
因為系統識別到最高位是1后面全0的情況,系統會在最高位自動添加一個符號位,所以-128具有9個bit位
-128在存入內存的時,因為char只有8個bit位,所以讀取低8位,結果是1000 0000;
與-0的二進制序列一樣,所以就用-128表示-0;系統識別1000 0000 時就會自動添加一個符號位,就是-128了。(在這里計算時符號位參與運算)
原碼 1 1000 0000
反碼 1 0111 1111
補碼 1 1000 0000
下面看幾個有關理解整形存儲的代碼:
#include<stdio.h>#include<windows.h>int main(){ unsigned char a = -1; signed char b= -1; char c = -1; PRintf("a=%d b=%d c=%d/n", a, b,c); system("pause"); return 0;}signed char型提升為int型打印時,char補碼的符號位前面要全補成和char相同的符號位,然后在把最高位當做符號位,求原碼。
#include<stdio.h>#include<windows.h>int main(){ char a = 128; char b = -128; printf("a = %u/nb = %u/n", a,b); system("pause"); return 0;}不論是128 還是-128保存到cahr a里面都是讀取補碼的低8位即1000 0000;
在a解釋用于打印的時候會把最高位(第八位)作為符號位即1,所以char 提升為unsigned int類型,char的符號位前面的根據char類型全補成1。 然后以無符號整形輸出。
新聞熱點
疑難解答