- #include <stdio.h>
- #include <stdlib.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,在计算机种采用补码的方式存储负数,补码即为原码取反加1,故-1的补码为0xff,同时可以得到一结论,原码+补码 = 2的(sizeof(码的类型))次方,如对于char型变量的-1来说,原码1 + 补码ff = 2^8.
对于本题因strlen输出长度是以'\0'结尾的,而在计算机中所有数据在内存中都是以二进制存在的,'\0'的ASCII码为0,所以在数组中只要遇到数组元素为0,即表示strlen函数计算结束,返回0前面的数组元素个数,因此该题只需知道数组的第几个元素为0即可,即在内存中该元素表示为1 0000 0000(当然这里的1只是表示数在内存中存储,实际上因为char是8位的,已将该位舍去)取其补码(取反加1)为255即a[254] = 0,那么strlen(a) = 255就是理所应当了,其实从前面的分析也可得出,如果去掉
- a[i] = -1-i;
那么strlen(a)结果是未知的,因为数组未初始化,系统会为其分配随机值。
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int i = -20;
- int j = 10;
- printf("%d",i + j);
- return 0;
- }
故输出-10,若是按%0x输出结果必为2^32 - 20 +10 = 0xfffffff6