整型在字符数组中的存储

这篇文章我们来讨论整型字符数组中的存储

首先我们来讨论一下字符

大家都知道一个字符占用一个字节,无符号字符型的范围是从0~255,而有符号字符型的范围是-128~127,那么对于有符号字符型而言,大于127或小于-128的数该怎么存储呢?请您往下欣赏:

以-129为例,我向大家展示一下吧
整数存的是源码,而负数存的是补码,所以说要存储-129,得先算出它的补码。
源码 本该是 1 1000 0001,但由于一个字节只能存储8位二进制数,所以源码为 1000 0001;反码为源码的除符号位之外,其余取反,0111 1110 即为反码;补码为反码+1,所以补码为0111 1111,原来-129在字符数组中存储的是127。
对于正数而言,源码反码补码都是一样的。

接着咋们用代码深入理解

#include<stdio.h>
#include<string.h>

int main()
{
    char a[1000];
    int i = 0;
    for(;i < 1000; ++i)
    {
        a[i] = -1 - i;
    }
    printf("%d\n",strlen(a));
    return 0;
}

这里写图片描述

我在字符数组里面存储了1000个整型,为什么会输出255呢?请您接着了解:
如果是sizeof(a),那毋庸置疑是1000,因为sizeof计算的是分配的数组a[1000]所占的内存空间大小,不受里面存储内容的影响。
而strlen是计算字符串的长度,以’\0’为字符串结束标志符。
那么我可以肯定的是我的数组中肯定提前出现了’\0’,才导致字符数组没有被遍历完。而且由于输出的是255,那么我可以肯定的是a[255]处肯定是’\0’,让我们编码试试:

#include<stdio.h>
#include<string.h>

int main()
{
    char a[1000];
    int i = 0;
    for(;i < 1000; ++i)
    {
        a[i] = -1 - i;
        if(i == 255)
        {
            printf("%d\n",a[i]);
        }
    }
    printf("%d\n",strlen(a));
    return 0;
}

这里写图片描述

果然 当i == 255时,a[i] == 0的,此时我需要向大家解释一下0 ‘\0’,’0’,”0”的区别,0和’\0’其实是一样的ASCII均为0,可以表示为0 == ‘\0’,而’0’是字符零,它的ASCII为48,与’\0’是不等的,而”0”是一个字符串,它的写法其实应该是”0\0”,’\0’是字符串自动加上去的,作为字符串结束符。
那么把整型的0存储到字符数组中究竟是什么呢?

总结整型在字符数组中的存储

解释至此,我想可以把结论告诉给大家了,其实整型在字符数组中的存储,就是将值转化成ASCII值进行存储,类似于哈希表的方式,一个键对应一个值,我们只需要找到它的键,进而取出它的值即可使用。所以我们不用担心整型存储到字符数组中会变成字符型,因为我们存储的是整型所对应的ASCII值,而不是整型本身。

码完,收工!

猜你喜欢

转载自blog.csdn.net/xzg_2017/article/details/80098838