問:為什麼有符號的char可表示范圍是-128~+127?
要明白這個問題,首先要明白一下幾點:
當計算機知道了這些規則後就可以完美轉化了,那我們看看計算機是如何轉化的:
首先計算機中的8位變化范圍是:
計算機中的補碼 我們轉化後的原碼 我們從原碼得到的十進制數 實際表示的十進制
0000 0000 0000 0000 0 0
..... .... .... ....
0111 1111 0111 1111 127 127
1000 0000 1000 0000 128 -128
.... .... ..... ......
1111 1111 0000 0001 1 -1
看到那個128怎麼一下變成了-128,還有那個1怎麼一下子變成了-1,再回去看看第三條規則就知道,計算機已經知道它這8位裡面存儲的是一個負數,不要給自己強加那個符號位的概念,那是給計算機的一個識別標志,計算機由這個識別標示知道它裡面存儲的是正數還是負數,並不影響我們使用這個位上的值,所以我們計算出來的這個128,它是個負的,故由上面的推導可以看出范圍是-128到127
關於補碼的兩個練習題:
問main函數最後的輸出結果是?
1 int main(void) 2 { 3 char a[1000]; 4 int i=0; 5 for(i=0;i<1000;i++) 6 { 7 a[i]=-1-i; 8 } 9 printf("%d\n",strlen(a)); 10 return 0; 11 }
結果是:255
問foo函數輸出結果是多少?
1 void foo() 2 { 3 unsigned int a=6; 4 int b=-20; 5 (a+b)>6?puts(">6"):puts("<=6"); 6 printf("%u\n",a+b); 7 }
結果是 >6