C语言整型在内存中的存储练习题详解6(Detailed explanation 6 of the practice questions of the storage in memory for c language )

 

C语言整型在内存中的存储 练习6 —— 说明以下代码输出结果

 1 #define _CRT_SECURE_NO_WARNINGS 1
 2 #include <stdio.h>
 3 
 4 int main()
 5 {
 6     char a[1000];
 7     int i;
 8     for (i = 0; i < 1000; i++)
 9     {
10         a[i] = -1 - i;
11     }
12     printf("%d \n", strlen(a));
13     return 0;
14 }

对于这一道题,需要注意以下几点:

1. 数组a的类型是有符号字符型,而有符号字符型的取值范围是 -128~127,按照循环来计算,如果存储够的情况下,a[i] 的值将会从 -1-0=-1 到 -1-999=-1000,但是存放它们的容器范围只在 -128~127,所以超出的值都会被换算到这个范围。

2. strlen 是求字符串长度的函数,求字符串长度找的是 \0,\0 的 ASCII 值是 0,所以我们要找的就是在 0 之前有多少个数字,那就是最终的答案。

代码详解:

进入循环后,a中存放的值分别是 -1,-2,-3, ......, -128  ,注意这里,到 -128 之后,-128+1 之后的值是什么呢?

回答这个问题可以借助 char 类型的圆轴表示图

由这个图可以看出,现在值从逆时针方向走,逆时针方向就是 +1 的方向,由图中可以看出, -128 +1 之后的值是 127,然后再到 126 ,最后再到 2,1,0 

我们关注第一次出现 0 的位置,因为第一次出现 0 的位置就是 strlen 函数要终止的地方,那么,在第一次出现 0 之前出现的数有哪些呢?

-1,-2,-3,...... ,-128,127,126,125,...... ,3,2,1

计算下,可知 -1 ~ -128 共有128个数,127 ~ 1 共有127个数,加起来就是255个数出现在 0 之前,所以最终的答案就是255

运行代码查看结果:

 

以上知识点来自:https://www.bilibili.com/video/BV1q54y1q79w?p=30&spm_id_from=pageDriver

posted @ 2022-05-24 11:26  ttweixiao9999  阅读(26)  评论(0编辑  收藏  举报