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

第一题:

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;
}

这里写图片描述

这道题的运行结果是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 输出,会发生整型提升。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值