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
整数的期望值。
但我经常看到程序员使用memset
将int
数组元素设置为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的最小负值。