数据在内存储存的经典列题

第一题:

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

数据在内存储存的经典列题_第1张图片

这道题的运行结果是255。
这里是把从-1到-1000的数存到数组a中,-1存放在内存中是以补码的形式11111111(char类型的8个bit位),再把-2存进数组(补码:11111110),一直到存到-128(补码10000000)。

但有符号char类型数据所能表示的最小的数就是-128,当-128再减1时,(10000000+11111111=01111111)最高位就会溢出,-129需要9位才能存储下来,而char类型的只有8位,所以最高位被丢弃,所以减出来的结果是127。
所以实际上这个数组里面存的是-1~-128~127~0,一共存了256个元素,但最后一个是0,也就是‘\0’的assic码值,当strlen遇到它时计数就停止,但0并没有记录进去,所以strlen(a) == 255。


第二题:
下面代码运行起来输出什么?

int main()
{
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%d,b=%d,c=%d", a, b, c);

    system("pause");
    return 0;
}

答案:a=-1,b=-1,c=255
c是无符号整型


第三题:

int main()
{
    char a = -128;
    printf("%u\n", a);

    system("pause");
    return 0;
}

答案:4294967168
这里把一个char类型的数据按unsigned int 输出,会发生整型提升。

你可能感兴趣的:(C知识总结)