int main()
{
char a[1000];
int i;
for (i=0;i<1000;i++) {
a[i]=-1-i;
}
printf("%d",strlen(a));
return 1;
}
如上,最后打印的结果是255
分析:
我们编写的任何数据传到计算机底层都会变成0和1,把基本数据类型的最高位腾出来
最高位是1,代表这个数位负数,最高位是0,代表正数。
因此char的数据类型虽然占有8位(1字节),但实际表示的范围则是 : -2^7~2^7-1
当最高位是1,其他位都是0时,则此时最高位的1即代表这个数是负数,也代表这个数的最高位。
而且,在计算机存储数字时,会存储这个数的补码,主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
回到题目,
-1的补码是11111111
当i的值为127时,a[127]值(char类型中不同的值代表不同的字符)为-128,二进制表示为:10000000 在计算机底层存储为:10000000当i=128时,a[128]的值不可能等于-129,因为此时如果是-129的话,二进制表示为110000001 应存储为:101111111
包括符号位已经是9位,超出了char类型的位数,计算机舍弃最高位,将这个数存储为:01111111 变成了正数127
同理,当i=255时,-256的补码的低8位是0,当i=256时,-257的补码的低八位是11111111,跟-1的补码一样,数组开始循环。
而strlen是计算字符串长度的,遇到'\0'时结束,返回字符串不包括'\0'的长度,
因为a[255]的值为0,代表的字符为'\0'
所以打印出来的数是255