看下面程序:
#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各位取反末位加1得1000 0001)-128的補碼爲1000 0000(1000 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=256,a[256]= -1這和前面一輪的取值是一樣的……
由於strlen計算長度不算最後的’/0’,因此它計算的長度爲a[0]~a[254],爲255。