Как 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 58

1 ответ:

как ни странно, причина этого работает с -1 точно так же, как причина, по которой это работает с нулями: in два дополняют двоичное представление,-1 и 1s во всех его битах, независимо от размера целого числа, поэтому заполнение области байтами, заполненными all 1 s создает область -1 подпись int s,longS и shorts на двух дополнительных аппаратных средствах.

на оборудовании, которое отличается от двух дополняют результат будет разный. Элемент -1 целочисленная константа будет преобразована в unsigned char из всех, потому что стандарт конкретно о том, как преобразование должно быть выполнено. Однако область байтов со всеми их битами установлена в 1 будет интерпретироваться как интегральные значения в соответствии с правилами платформы. Например, на знака и величины оборудования все элементы массива будут содержать наименьшее отрицательное значение соответствующего типа.