Как 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и1s во всех его битах, независимо от размера целого числа, поэтому заполнение области байтами, заполненными all1s создает область-1подписьints,longS иshorts на двух дополнительных аппаратных средствах.на оборудовании, которое отличается от двух дополняют результат будет разный. Элемент
-1целочисленная константа будет преобразована вunsigned charиз всех, потому что стандарт конкретно о том, как преобразование должно быть выполнено. Однако область байтов со всеми их битами установлена в1будет интерпретироваться как интегральные значения в соответствии с правилами платформы. Например, на знака и величины оборудования все элементы массива будут содержать наименьшее отрицательное значение соответствующего типа.