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

posted on 2019-10-15 11:25  kenny.wmh  阅读(1049)  评论(0编辑  收藏  举报

导航