memset如何用-1来初始化一个整型数组?

关于memset的manpage说:

 #include <string.h> void *memset(void *s, int c, size_t n) 

memset()函数用常量字节c填充s指向的内存区域的前n 字节。

很明显memset不能用来初始化int数组,如下所示:

 int a[10]; memset(a, 1, sizeof(a)); 

这是因为int是由4个字节(比如说)表示,并且不能获得数组a整数的期望值。
但我经常看到程序员使用memsetint数组元素设置为0-1

 int a[10]; int b[10]; memset(a, 0, sizeof(a)); memset(b, -1, sizeof(b)); 

根据我的理解,使用整数0初始化是可以的,因为0可以用1个字节表示(可能在这种情况下我错了)。 但是如何用-1 (一个4字节的值)来初始化b

奇怪的是,这与-1工作的原因与用零处理的原因完全相同:在二进制补码的二进制表示中,无论整数的大小如何, -1的所有位都有1 s,所以填充带有全部1个字节的区域在二进制补码硬件上产生-1符号int的区域, long s和short s。

在不同于二进制补码的硬件上,结果会有所不同。 -1整数常量将被转换为全1的unsigned char ,因为标准是具体如何执行转换。 但是,所有位设置为1的字节区域将根据平台的规则被解释为整数值。 例如,在符号和数值硬件上,数组中的所有元素都将包含相应types的最小负值。