#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;
unsigned int j = 10;
printf("%d",i + j);
return 0;
}
按前面所说int型20的补码为2^32 - 20(为了方便已将二进制转换为十进制,后面相同),i+j 会进行类型转换int -> unsigned int ,故i+j =
2^32 - 20 +10,然最后是要按无符号数输出则2^32 - 20 +10取补码为2^32 -( 2^32 - 20 +10) = 10(这里是10没有写错)
故输出-10,若是按%0x输出结果必为2^32 - 20 +10 = 0xfffffff6