IT이야기

memset은 어떻게 정수 배열을 -1로 초기화합니까?

cyworld 2022. 6. 7. 21:33
반응형

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바이트(예를 들어)로 표시되며 배열 내의 정수에 대해 원하는 값을 얻을 수 없습니다.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이것이 0과 함께 작동하는 이유와 정확히 같습니다. 2의 보완 이진수 표현에서는-1가지다1s는 정수의 크기에 관계없이 모든 비트로 표시되므로 모든 비트로 채워진 바이트로 영역을 채웁니다.1s는 다음 영역을 생성합니다.-1서명된ints,longshort2개의 보완 하드웨어에 탑재되어 있습니다.

2개의 하드웨어와 다른 하드웨어에서는 결과가 다릅니다.-1정수 상수는 다음 값으로 변환됩니다.unsigned char그 이유는 변환이 어떻게 수행되어야 하는지에 대한 기준이 특정하기 때문이다.단, 모든 비트가 다음과 같이 설정된 바이트 영역1플랫폼 규칙에 따라 정수 값으로 해석됩니다.예를 들어, 부호 크기 하드웨어에서는 배열의 모든 요소가 해당 유형의 최소 음수 값을 포함합니다.

숫자의 모든 비트가 인 경우 도 0이 됩니다.단, 모든 비트가 -1일 경우 값은 -1입니다.

우리가 쓰는 만약int a[2], 4x2 바이트의 메모리가 할당되어 있습니다.이 메모리에는 랜덤비트/패킷비트가 포함되어 있습니다.

00110000 00100101 11100011 11110010    11110101 10001001 00111000 00010001

그리고 나서, 우리가 쓰는memset(a, 0, sizeof(a)).지금이다,memset()바이트의 작품 바이트, 바이트를 표현(.unsigned char)0의00000000. 그래서 becomes-

00000000 00000000 00000000 00000000    00000000 00000000 00000000 00000000

따라서a[0]그리고.a[1]0을 사용하여 초기화되나.


자, 볼 수 있도록 만드memset(a, -1, sizeof(a)):-1을 위한 하나의 바이트이다.11111111. 그리고, 우리는 get-

11111111 11111111 11111111 11111111    11111111 11111111 11111111 11111111

여기, 둘 다a[0]그리고.a[1])값이 있을 것입니다.


하지만memset(a, 1, sizeof(a)):1바이트에 있다.00000001-

00000001 00000001 00000001 00000001    00000001 00000001 00000001 00000001

그래서 값 16843009 be- 것이다.

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

반응형