该手册页说,约memset
:
#include <string.h> void *memset(void *s, int c, size_t n)
的
memset()
功能填充第一n
字节由指向的存储器区域的s
具有恒定字节c
。
很明显,memset
不能使用它来初始化int
数组,如下所示:
int a[10];
memset(a, 1, sizeof(a));
这是因为int
用4个字节表示(例如),并且无法获得array中整数的期望值a
。
但是我经常看到程序员memset
用来将int
数组元素设置为0
或-1
。
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
根据我的理解,用整数初始化0
是可以的,因为0
可以用1个字节表示(在这种情况下我可能错了)。但是如何b
用-1
(4个字节的值)初始化呢?
奇怪的是,之所以这个作品用-1
是完全一样的,这个作品以零的原因:在二进制补码表示,-1
拥有1
S IN的所有位,无论整数的大小,在一个地区做馅用字节填充all 在二进制补码硬件上1
生成带-1
符号int
s,long
s和short
s 的区域。
在不同于二进制补码的硬件上,结果将有所不同。的-1
整数常数将被转换成一个unsigned char
全部为,因为标准是特定的转换必须如何进行。但是,1
根据平台的规则,所有位都设置为的字节区域将被解释为整数值。例如,在符号和大小的硬件上,数组的所有元素将包含对应类型的最小负值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句