關於字符的一道很容易做錯的題目

看下面程序:

#include<stdio.h>

int main()

{

       char a[1000];

       int i,j;

       for(i=0;i<1000;i++)

              a[i]=-1-i;

       printf("%d/n",strlen(a));

       return 0;

}

請問上述程序的輸出結果是什麼?答案是255

解答該題需要注意以下幾點:

1、  數據在機器中是如何存取的?數據在機器中是以補碼形式存放的。正數的補碼和其原碼一致,負數的補碼符號位爲1,其餘位爲該數絕對值的原碼各位取反然後末位加1

2、  兩個用補碼錶示的數,如果最高位(符號位)有進位則進位被捨棄。

3、  -1的補碼爲1111 1111(及0xff,-127的補碼爲(0111 1111各位取反末位加11000 0001-128的補碼爲1000 00001000 0000各位取反末位加1得到)

4、  char型的取值範圍:[-128,127],當數值超過該範圍時會發生溢出,變量的值只能從8位存取空間中取。

5、  strlen函數是計算字符串的長度的,並不包含字符串最後面的’/0’,而判斷一個字符串是否結束的標誌就是看其是否遇到’/0’,如果遇到’/0’,則認爲本字符串結束。

 明白了上述幾點,上述程序題則不難了。a[0]=-1,a[1]=-2……a[127]=-128,然後當i=128時內存中的二進制比特將發生溢出而取得低8位值,a[128]=127,a[129]=126,……a[254]=1,a[255]=0,然後i=256a[256]= -1這和前面一輪的取值是一樣的……

    由於strlen計算長度不算最後的’/0’,因此它計算的長度爲a[0]~a[254],255。

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