VisualStudio.C++.C#/C . C++
C/C++. & 와 * 메모리 접근 형변환
i.got.it
2020. 1. 13. 20:05
uint32_t ui32 = 26584;
uint8_t ui8[4];
////32비트 정수 ui32 를 8비트 정수배열에 배치하기.
uint8_t * pui8 = (uint8_t*)&ui32; // ui32 의 주소를 uint8_t 포인터 형으로 받고.
ui8[0] = *(pui8+0);
ui8[1] = *(pui8+1);
ui8[2] = *(pui8+2);
ui8[3] = *(pui8+3);
///// ui8[0],[1],[2],[3] 개별적으로 분리된 것을 다시 32비트 정수 1개로 변환하기.
//// ui8[0] + 2^8*ui8[1] + 2^16*ui8[2] + 2^24*ui8[3] <- 이렇게 하는것보다 아래과 훨씬 빠르고 간편.
uint32_t myui32 = *(uint32_t*)&ui8[0]; // ui8[0] 주소를 uint32_t포인터형변환하고 그주소의 값을 * 로 받음.
/// 위와 같은 연산이 가능한 이유는 메모리 주소의 연속성이 있기때문에 가능한것.
/// 만일 아래와 같은 방식으로 ui8[] 각각의 값을 uint8_t 개별변수 byte0~3 에 대입한 경우
uint8_t byte0 = ui8[0];
uint8_t byte1 = ui8[0];
uint8_t byte2 = ui8[0];
uint8_t byte3 = ui8[0];
uint32_t myui32 = *(uint32_t*)&byte0; // 이것 절대 안됨. !!!!!
// byt0,1,2,3 각 변수의 메모리 배치는 절대 연속 보장되지 않기 때문에 절대 안됨.
// byte0,1,2,3 을 이용하여 32비트 정수 1개 만들려면 아래처럼 계산해야함.
byte0 + 2^8*byte1 + 2^16*byte2 + 2^24*byte3
연관
- 위와 동일한 원리로 flot형에서도 유용하게 사용가능.
첫 등록 : 2020-01-13
최종 수정 :
단축 주소 : https://igotit.tistory.com/