先来看一个问题:
#include<stdio.h>
#include<string.h>
int main() {
char a[1000];
for (int i = 0; i < 1000; i++) {
a[i] = -1-i ;
}
printf("%d %d", strlen(a), sizeof(a));
return 0;
}
看到这个代码,你认为输出的结果应该是多少呢?
输出结果:
在解释这个结果前,首先对strlen() 函数再次做一个简单的介绍吧!
C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
声明
下面是 strlen() 函数的声明。
size_t strlen(const char *str)
参数
- str -- 要计算长度的字符串。
返回值
该函数返回字符串的长度。
重点
该函数在遇到ASCII码为0,代表'\0'的字符时即结束并返回不包含结束符的长度值。
分析:
我们编写的任何数据传到计算机底层都会变成0和1,把基本数据类型的最高位腾出来
最高位是1,代表这个数位负数,最高位是0,代表正数。
因此char的数据类型虽然占有8位(1字节),但实际表示的范围则是 : -2^7~2^7-1
当最高位是1,其他位都是0时,则此时最高位的1即代表这个数是负数,也代表这个数的最高位。
而且,在计算机存储数字时,会存储这个数的补码,主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
再次解析题目:
-1的补码是1111 1111
当i=127时,a[127] 的值(char类型中不同的值代表不同的字符)为 -128
二进制表示为:1000 0000
在计算机底层存储为:1000 0000
当i=128时,a[128]的值不可能等于-129,因为此时如果是-129
二进制表示为1 1000 0001
在计算机底层存储为:1 0111 1111
包括符号位已经是9位,超出了char类型的位数
计算机舍弃最高位,将这个数存储为:0111 1111 变成了正数127
同理,当i=255 时,-256的补码的低8位是 0000 0000
当i=256时,-257的补码的低八位是1111 1111,跟-1的补码一样,开始循环。
而 strlen() 是计算字符串长度的,遇到'\0'时结束,返回字符串不包括'\0'的长度。
因为a[255]的值为0,代表的字符为'\0',所以打印出来的数是255