1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (char*)a; 7 for( int i = 0; i < 2000; i++) 8 a[i] = -1 - i; 9 printf( "%d\n", strlen(p)); 10 return 0; 11 }
運行結果是:1020
解析:
首先要明白負數在內存中的存儲方式,還要知道int和char各占幾位(都是最基本的啦)。這里很容易知道:
a[0] = -1 內存中應當是:11111111 11111111 11111111 11111111
a[1] = -2 內存中應當是:11111111 11111111 11111111 11111110
a[2] = -3 內存中應當是:11111111 11111111 11111111 11111101
……
a[255] = -256 內存中應當是: 11111111 11111111 1111111100000000
當程序計算strlen(p)的時候遇到8個0就停止了(因為‘\0'的ascii碼為0),strlen不包括’\0'.所以是255 * 4 + 3 = 1023.
為什么結果是1020呢?(PS:C/C++ 一般都是小端存儲,網絡傳輸和Java是大端存儲)這就涉及到內存的存儲問題了。
眾所周知,內存存儲分為大端小端,大端就是我們人類理解的這樣,將高位寫在前面,將地位寫在后面,小端存儲則正好相反.
所以a[255] = -256 在內存中的表示形式是:
00000000 11111111 11111111 11111111,
這就是為什么答案是1020。當然了不同的CPU也會有的會有不同。