C筆試題:將int型數組強制轉換為char*,再求strlen,涉及大小端


 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也會有的會有不同。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM