解析:C语言中有符号char类型溢出

#include <stdio.h>
#include <string.h>
int main()
{
	char a[1000];
	for (int i = 0; i < 1000; i++) {
		a[i] = -1 - i;
	}
	printf("%d\n", strlen(a));
	return 0;
}

char类型是有符号的,范围为-128到127

随着程序循环的进行,a[ i ]依次被赋值 -1,-2,-3,……-128,

根据C语言的规范,溢出后的结果是未定义的,这意味着编译器可以根据具体实现来决定溢出后的结果。在大多数情况下,溢出后的结果会回绕到类型的最大值,也就是127。所以,通常情况下,-128减去1后的值会变为127。

a[ i ]= -1 - i 小于-128时被赋值为127,126,……3,2,1,0。以此往复循环一千次(如下图)。当strlen读取到第一个“ 0 “结束(\0的ASCll值为0),所以一共为128+127=255个,输出结果为255

猜你喜欢

转载自blog.csdn.net/m0_73800602/article/details/132070948