几个越界的问题

#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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页