signed 與 unsigned 關鍵字

#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],超出這個範圍的值會產生溢出;另外還要清楚的就是負數的補碼怎麼表示。弄明白了這兩點,這個問題其實就很簡單了。
 

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