Programing

memset이 정수 배열을 -1로 초기화하는 방법은 무엇입니까?

lottogame 2020. 12. 2. 07:44
반응형

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));  

그것은 int4 바이트 (예를 들어)로 표현되고 array의 정수에 대해 원하는 값을 얻을 수 없기 때문 a입니다.
하지만 프로그래머 memsetint배열 요소를 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정확히 제로이 작동하는 이유와 같습니다의 2의 보수 바이너리 표현이 , -11때문에 바이트 영역에서 작성에 관계없이 정수의 크기, 모든 비트들, 가득 all 1s는 2의 보수 하드웨어에서 -1부호있는 ints, longs 및 shorts 영역을 생성합니다 .

2의 보수와 다른 하드웨어에서는 결과가 달라집니다. -1정수 상수는로 변환 할 것이다 unsigned char표준이 변환이 수행해야하는 방법에 대한 때문에, 모든 사람의. 그러나 모든 비트가 설정된 바이트 영역은 1플랫폼 규칙에 따라 정수 값으로 해석됩니다. 예를 들어 부호 및 크기 하드웨어에서 배열의 모든 요소에는 해당 유형의 가장 작은 음수 값이 포함됩니다.


숫자의 모든 비트가 0이면 값도 0 입니다. 그러나 모든 비트가 있으면 1값은 -1 입니다.


우리가 쓸 때 int a[2], 4 × 2는 임의 / 쓰레기가 포함되어 할당되는 메모리의 바이트 bits-

00110000 00100101 11100011 11110010    11110101 10001001 00111000 00010001


그런 다음 memset(a, 0, sizeof(a)). 이제 &를 memset()구분하지 않습니다 . 그것은 바이트 단위로 작동합니다 . 그리고 0의 1 바이트 표현은 입니다 . 그래서 우리는intchar00000000

00000000 00000000 00000000 00000000    00000000 00000000 00000000 00000000

따라서, 모두 a[0]와는 a[1]초기화됩니다 0 .


이제 보자 memset(a, -1, sizeof(a)): -1의 1 바이트 11111111. 그리고 우리는

11111111 11111111 11111111 11111111    11111111 11111111 11111111 11111111

여기에서 a[0]둘 다 a[1]-1 을 갖습니다 .


그러나 for memset(a, 1, sizeof(a)): 1 바이트는 00000001-

00000001 00000001 00000001 00000001    00000001 00000001 00000001 00000001

따라서 값은 16843009 입니다.

참고 URL : https://stackoverflow.com/questions/24207698/how-memset-initializes-an-array-of-integers-by-1

반응형