본문 바로가기
VisualStudio.C++.C#/C . C++

C/C++. & 와 * 메모리 접근 형변환

by 리치굿맨 2020. 1. 13.

 

 

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형에서도 유용하게 사용가능. 

 

 

float 형 변수에 할당된 4바이트 메모리의 각 바이트 단위로 접근하는법.

문제. 변수 선언이 float f_value; 처럼 float 으로 선언되어있어서, 통상적인 실수값을 이 변수에 대입(예 f_value = 3.789f )하여 실수로 활용하지 않고, f_value 에 할당된 메모리 4바이트들의 각 바이트들에..

igotit.tistory.com

 

 

 

 


첫 등록 : 2020-01-13

최종 수정 : 

단축 주소 : https://igotit.tistory.com/

 


 

댓글0


   
현물 |선물 인버스 |선물 USDT     현물 | 선물 USDT |봇제작툴/카피트레이딩     현물 |선물 인버스 |선물 USDT     선물 인버스 |선물 USDT