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