#include <stdio.h>
#include <string.h>
int main()
{
char arr[1000];
int i;
for (i=0; i<1000; i++)
{
arr[i] = -1-i;
}
printf("%d\n",strlen(arr));
return 0;
}
大家一眼看到這個,會說出什麼答案呢?肯定有不同的答案的。正確的答案應該是255。
255?或許有些人不解為什麼會是255,就是因為數組的類型char,在這裡面表示有符號的char。
for 循環內,當i 的值為0 時,a[0] 的值為-1 。關鍵就是-1 在內存裡面如何存儲。我們知道在計算機系統中,數值一律用補碼來表示(存儲)。主要原因是使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。正數的補碼與其原碼一致;負數的補碼:符號位為1 ,其余位為該數絕對值的原碼按位取反,然後整個數加1。
按照負數補碼的規則,可以知道-1 的補碼為0xff ,-2 的補碼為0xfe…… 當i 的值為127時,a[127] 的值為-128 ,而-128 是char 類型數據能表示的最小的負數。當 i 繼續增加,a[128]的值肯定不能是-129 。因為這時候發生了溢出,-129 需要9 位才能存儲下來,而char 類型數據只有8 位,所以最高位被丟棄。剩下的8 位是原來9 位補碼的低8 位的值,即0x7f 。當i 繼續增加到255 的時候,-256 的補碼的低8 位為0 。然後當i 增加到256 時,-257 的補碼的低8 位全為1 ,即低八位的補碼為0xff ,如此又開始一輪新的循環……
按照上面的分析,a[0] 到a[254] 裡面的值都不為0 ,而a[255] 的值為0 。strlen 函數是計算字符串長度的,並不包含字符串最後的‘\0 ’。而判斷一個字符串是否結束的標志就是看是否遇到‘\0 ’。如果遇到‘\0 ’,則認為本字符串結束。