#include<stdio.h>
#include<string.h>
int main()
{
int a[2000];
char *p = (char*)a;
for( int i = 0; i < 2000; i++)
a[i] = -1 - i;
printf( "%d\n", strlen(p));
return 0;
}
这是一道涉及大小端的问题以及负数在计算机中的存储。
按着程序开始解释吧
(1)定义一个数组a,在计算中怎么开辟的?
在栈中开辟一块内存 注意:虽然栈的生长方向是向下的,但是在数组中地址生长还是递增的,
举个例子:这个定义的三个变量
再看看数组
在栈中先申请 b,c,d三个int型的变量,他们的地址依次减小,可以验证栈中地址是向下的,接着申请一个int类型的数组,大小为2000,可以看出a[1999]的地址紧挨着d的地址,而数组中的地址是递增的:a[0],a[1],a[2]
所以 总结一下,在栈中申请数组,地址是递增的,a[0],a[1],a[2]
(2)介绍下大小端问题以及负数存储
什么是大小端
大小端问题是在计算中存储的
大端:低位存放到高地址处,高位存放到低地址处
小端:低位存放到地址中,高位存放到高地址处(符合人的正常思维)
计算机中负数的存储是以反码存储的
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 11111111 00000000
而在计算机中一般是小端存储的(我的是intel 的cpu),一会贴代码判断大小端
a[0] —-a[255] 地址是递增的,而数字是以小端存放的
所以 -256 存放 00000000 11111111 11111111 11111111
所以 最终的结果是 255*4 = 1020
另外判断大小端问题
//大端:低位存在高地址处
//小端:低位存在低地址处
int check()
{
union UN
{
int n;
char i;
}un;
un.n = 1;
return un.i;
//返回1 表示小端存储,返回0表示大端存储
}
int check2()
{
int num = 1;
char c = (char)num;
return c;
}