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 바이트 (예를 들어)로 표현되고 array의 정수에 대해 원하는 값을 얻을 수 없기 때문 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
정확히 제로이 작동하는 이유와 같습니다의 2의 보수 바이너리 표현이 , -1
이 1
때문에 바이트 영역에서 작성에 관계없이 정수의 크기, 모든 비트들, 가득 all 1
s는 2의 보수 하드웨어에서 -1
부호있는 int
s, long
s 및 short
s 영역을 생성합니다 .
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 바이트 표현은 입니다 . 그래서 우리는int
char
00000000
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
'Programing' 카테고리의 다른 글
OpenGL을 디버깅하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.02 |
---|---|
Access last logged value in Chrome console (0) | 2020.12.02 |
Python에서 예외 메시지를 올바르게 얻는 방법 (0) | 2020.12.02 |
ASP.NET MVC에서 ETag를 어떻게 지원합니까? (0) | 2020.12.02 |
Visual Studio 2010은 어떤 C ++ 11 기능을 지원합니까? (0) | 2020.12.02 |