Как memset инициализирует массив целых чисел -1?

страница руководства говорит о 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 байтами (скажем), и нельзя получить желаемое значение для целых чисел в массиве 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 байта)?

59

Решение

Странно, причина, по которой это работает -1 точно так же, как причина того, что это работает с нулями: в двоичное представление дополнения до двух, -1 имеет 1s во всех его битах, независимо от размера целого числа, поэтому заполнение области байтами, заполненными всеми 1s производит область -1 подписанный ints, longс и shortна двух дополнительных аппаратных.

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

67

Другие решения

Когда мы пишем int a[2], 4х2 выделяется байт памяти, которая содержит случайные / мусорные биты

00110000 00100101 11100011 11110010    11110101 10001001 00111000 00010001

Потом пишем memset(a, 0, sizeof(a)), Сейчас, memset() не различает int & char, Оно работает байт за байтом. И одно байтовое представление 0 является 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.

-1

По вопросам рекламы [email protected]