一道关于内存的C语言题

举报
ReCclay 发表于 2022/02/22 01:08:52 2022/02/22
【摘要】 可先参考,相关的内存数据存储及运算的博文。 1、keil里的补码 2、计算机里的原码、反码、补码 #include <stdio.h> #include <string.h&g...

可先参考,相关的内存数据存储及运算的博文。
1、keil里的补码

2、计算机里的原码、反码、补码


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

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

猜,答案是多少?第一次做就错了,2333。。。。。
做这个题的基础你必须得先理解上面所讲。

答案 255
先掌握一个快速算负数在内存当中补码的技巧,先写出对应正数的二进制,然后最高位补1,然后从最低位开始遇到第一个1之前都不变,遇到之后,保留这个1以及符号位,这之间的数按位取反即可。

下面仔细分析一波:
-1在内存当中的存储为:0000 0001->1000 0001->1111 1111
-2在内存当中的存储为:0000 0010->1000 0010->1111 1110
……
-127对应存储为:0111 1111->1111 1111->1000 0001
-128对应存储为:1000 0000->1 1000 0000->1 1000 0000->(取八位)1000 0000
-129对应存储为:1000 0001->1 1000 0001->1 0111 1111->(取八位)0111 1111
……
-255对应存储为:1111 1111->1 1111 1111->1 0000 0001->(取八位)0000 0001
-256对应存储为:1 0000 0000->11 0000 0000->11 0000 0000->(取八位)0000 0000
-257对应存储为:1 0000 0001->11 0000 0001->10 1111 1111->(取八位)1111 1111 此处相当于又从-1开始了

strlen 函数是计算字符串长度的,并不包含字符串最后的‘\0’。

所以到a[255]=-256就完了,所以总长度为a[0]到a[254]共255

文章来源: recclay.blog.csdn.net,作者:ReCclay,版权归原作者所有,如需转载,请联系作者。

原文链接:recclay.blog.csdn.net/article/details/78946711

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。