Как memset инициализирует массив целых чисел на -1?
The manpage говорит о memset
:
#include <string.h> void *memset(void *s, int c, size_t n)
The
memset()
функция заполняет первыйn
байт из области памяти, на которую указываетs
С постоянным байтc
.
очевидно, что 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 байт (может быть, я ошибаюсь в этом контексте). Но как можно инициализировать b
С -1
(значение 4 байта)?
1 ответ:
как ни странно, причина этого работает с
-1
точно так же, как причина, по которой это работает с нулями: in два дополняют двоичное представление,-1
и1
s во всех его битах, независимо от размера целого числа, поэтому заполнение области байтами, заполненными all1
s создает область-1
подписьint
s,long
S иshort
s на двух дополнительных аппаратных средствах.на оборудовании, которое отличается от двух дополняют результат будет разный. Элемент
-1
целочисленная константа будет преобразована вunsigned char
из всех, потому что стандарт конкретно о том, как преобразование должно быть выполнено. Однако область байтов со всеми их битами установлена в1
будет интерпретироваться как интегральные значения в соответствии с правилами платформы. Например, на знака и величины оборудования все элементы массива будут содержать наименьшее отрицательное значение соответствующего типа.