#include<stdio.h>
int main()
{
char a[1000];
int i;
for(i = 0;i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d",strlen(a));
return 0;
}
运行结果:255
解析:char 型变量占用1个字节8bit,范围为-128~127,-128 - 1 = 127,-128补码为1000 0000,-1补码为1111 1111,两者相加溢出得0111 1111,即为127,运行时a[127] = -128,a[128] = 127,a[129] = 126........ a[255] = 0,0的ASCII码是‘\0’,当strlen检测到\0时就停止,所以输出为255.这是默认为有符号情况下。
如果是无符号,范围为0~255,无符号情况下0-1=255,因为0的补码为0000 0000,-1的补码为1111 1111,加在一起为1111 1111,无符号情况下,1111 1111是255的补码,也是原码。所以a[0] = 0 - 1 = 255,a[1] = 254
......a[255] = 0,同理输出为255。
二、strlen与sizeof的区别
1、
char src[100] = "hello world";
使用strlen测量得11,sizeof测量得100.
2、
char src[] = "hello world";
strlen 11
sizeof 12
sizeof测量的是占用内存所以字符串结尾的\0也要算进去。
3、
char *src = "hello world";
strlen 11
sizeof 4
因为指针占用内存恒为4.