C语言 strlen() 函数与 char 型的一些问题

先来看一个问题:

#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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值