memset如何以-1初始化整数数组
How memset initializes an array of integers by -1?
手册说关于memset
:
#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
起作用的原因与对零起作用的原因完全相同:在two的补码二进制表示中,-1
的所有位都有1
s,无论整数的大小,因此用所有1
s填充的字节填充区域会产生一个-1
区域,在two的补码硬件上有int
s, long
s和short
s。
在不同于2的补码的硬件上,结果将不同。整型常量-1
将被转换为所有整型常量中的unsigned char
,因为标准特定于必须如何执行转换。但是,根据平台规则,所有位设置为1
的字节区域将被解释为整数值。例如,在符号和大小硬件上,数组的所有元素都将包含相应类型的最小负值。
当一个数的所有位都为 0
时,其值也为0。但是,如果所有位都是 1
,则值为-1。
如果我们写int a[2]
, 4x2字节的内存被分配,其中包含随机/垃圾位-
00110000 00100101 11100011 11110010 11110101 10001001 00111000 00010001
然后,我们写memset(a, 0, sizeof(a))
。现在,memset()
一个字节一个字节地工作,0的一个字节表示(unsigned char
)是00000000
。因此,它变成了-
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
因此,a[0]
和a[1]
都初始化为0。
现在让我们看看memset(a, -1, sizeof(a))
: 的一个字节-1是11111111
。得到-
11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111
这里,a[0]
和a[1]
的值都是-1。
然而,对于
memset(a, 1, sizeof(a))
: 1在一个字节中是00000001
-
00000001 00000001 00000001 00000001 00000001 00000001 00000001 00000001
,将价值—— 16843009 。
- C++使用整数的压缩数组初始化对象
- 整数在VSCommunity2019,windows10中未初始化
- 为什么初始化 std::vector 时不能使用模板整数?
- 在标头中C++整数初始化
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 如何初始化整数+字符串数组
- 如何将整数重新初始化/设置为空值
- 使用整数初始化列表初始化长双精度的向量
- 当 map 是一个整数数组并且由 operator[] 创建时,它是否初始化其映射类型
- 使用 size_t 初始化循环变量时的整数下溢
- C++11 整数初始化
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 如何初始化无符号整数uint8_t
- 如何使用整数列表在LLVM中初始化整数数组
- 初始化整数成员变量会导致更改另一个成员变量的地址
- 初始化整数的隔离错误
- 为什么在C++类中只能初始化整数或枚举类型
- memset如何以-1初始化整数数组
- 位集限制,如何在C++中运行时初始化整数