int*转换成char*,求strlen,涉及大小端问题以及栈

#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;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值