幾個越界的問題

#include <stdio.h>
#include <stdlib.h>
int main()
{
	char a[1000];
	int i;
	for(i=0; i<1000; i++)
 	{
 	 a[i] = -1-i;
	 }
	printf("%d",strlen(a));
	return 0;
}

  上述結果255,在計算機種採用補碼的方式存儲負數,補碼即爲原碼取反加1,故-1的補碼爲0xff,同時可以得到一結論,原碼+補碼 = 2的(sizeof(碼的類型))次方,如對於char型變量的-1來說,原碼1 + 補碼ff = 2^8.

  對於本題因strlen輸出長度是以'\0'結尾的,而在計算機中所有數據在內存中都是以二進制存在的,'\0'的ASCII碼爲0,所以在數組中只要遇到數組元素爲0,即表示strlen函數計算結束,返回0前面的數組元素個數,因此該題只需知道數組的第幾個元素爲0即可,即在內存中該元素表示爲1 0000 0000(當然這裏的1只是表示數在內存中存儲,實際上因爲char是8位的,已將該位捨去)取其補碼(取反加1)爲255即a[254] = 0,那麼strlen(a) = 255就是理所應當了,其實從前面的分析也可得出,如果去掉

 a[i] = -1-i;

那麼strlen(a)結果是未知的,因爲數組未初始化,系統會爲其分配隨機值。


#include <stdio.h>
#include <stdlib.h>
int main()
{
	
	int i = -20;
	unsigned int j = 10;
	printf("%d",i + j);
	return 0;
}
按前面所說int型20的補碼爲2^32 - 20(爲了方便已將二進制轉換爲十進制,後面相同),i+j 會進行類型轉換int -> unsigned int ,故i+j = 2^32 - 20 +10,然最後是要按無符號數輸出則2^32 - 20 +10取補碼爲2^32 -( 2^32 - 20 +10) = 10(這裏是10沒有寫錯)

故輸出-10,若是按%0x輸出結果必爲2^32 - 20 +10 = 0xfffffff6

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