#include <stdio.h>
#include <string.h>
int main(void)
{
signed char a[1000];
int i;
for(i=0;i<1000;i++)
a[i]= -1 -i;
printf("%d\n", strlen(a));
return 0;
}
上面輸出的結果爲255;
for循環內,當i的值爲0時, a[0]的值爲-1。關鍵就是-1在內存裏面如何存儲?
我們知道在計算機系統中,數值一律用補碼來表示(存儲),主要原因是,使用補碼可以將符號位和其他位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。正數的補碼與其原碼一致;負數的補碼:符號位爲1,其餘位爲該數絕對值的原碼按位取反,然後整個數加1。
按照負數補碼的規則,可以知道-1的補碼爲Oxff,-2的補碼爲Oxfe...當i的值爲127時,a[127]的值爲-128,而-128是char類型數據能表示的最小的負數。當i繼續增加, a[128]的值肯定不能是-129,因爲這時候發生了溢出,-129需要9位才能存儲下來,而char類型數據只有8位,所以最高位被丟棄。剩下的8位是原來9位補碼的低8位的值,即Ox7f。當i繼續增加到255的時候,-256的補碼的低8位爲0;然後當i增加到256時,-257的補碼的低8位全爲1,即低8位的補碼爲Oxff,如此又開始一輪新的循環....
按照上面的分析, a[0]~ a[254]裏面的值都不爲0,而a[255]的值爲0strlen函數是計算字符串長度的,並不包含字符串最後的'\0'。判斷一個字符串是否結束的標誌就是看是否遇到'\0';如果遇到'\0',則認爲本字符串結束。
分析到這裏, strlen(a)的值爲255應該完全能理解了。這個問題的關鍵就是要明白signed char類型表示的值的範圍爲[-128, 127],超出這個範圍的值會產生溢出;另外還要清楚的就是負數的補碼怎麼表示。弄明白了這兩點,這個問題其實就很簡單了。