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

来源:互联网 发布:数据磁带怎么用 编辑:程序博客网 时间:2024/05/21 14:46

第一题:

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 输出,会发生整型提升。

原创粉丝点击