2014-03-31 5 views
5
error: invalid static_cast from type ‘unsigned char*’ to type ‘uint32_t* {aka unsigned int*}’ 
    uint32_t *starti = static_cast<uint32_t*>(&memory[164]); 

char 배열을 할당했으며 4 바이트를 32 비트 int로 읽고 싶지만 컴파일러 오류가 발생합니다. 는 내가 조금과 같이 이동할 수 있다는 사실을 알고 :부호없는 char *을 unsigned int *로 변환 할 수 있습니까?

(start[0] << 24) + (start[1] << 16) + (start[2] << 8) + start[3]; 

을 그리고 그것은 같은 일을 할 것입니다, 그러나 이것은 추가 작업을 많이합니다.

어떻게 4 바이트를 int로 캐스트 할 수 있습니까?

+0

그래. 'uint32_t val = * (uint32_t *) (void *) (memory + 164)); ' – IdeaHat

+0

여기 좀보세요 : http://stackoverflow.com/questions/2473628/c-cant-static-cast-from- double-to-int? rq = 1 – Marius

+0

이것은'C++'-y와 같지 않다는 것을 알아야한다. 예를 들어 파일이나 네트워크에서 '메모리'를 가져 오는 경우 엔디안을 걱정해야합니다. –

답변

8

static_castdouble -> int과 같이 "정상적으로 동작하는"캐스트에 사용됩니다. 당신이 그것까지하는 경우, C 스타일 캐스트,

uint32_t *starti = reinterpret_cast<uint32_t*>(&memory[164]); 

을 또는 :

uint32_t *starti = (uint32_t*)&memory[164]; 
0

내가 BDS2006 C 익숙해 ++ 어쨌든이 너무 다른 컴파일러에 잘 작동합니다 당신은 reinterpret_cast을 사용해야합니다

char memory[164]; 
int *p0,*p1,*p2; 
p0=((int*)((void*)(memory))); // p0 starts from start 
p1=((int*)((void*)(memory+64))); // p1 starts from 64th char 
p2=((int*)((void*)(&memory[64]))); // p2 starts from 64th char 
6

예, 당신은 사용 (uint32_t*unsigned char* 포인터 값을 변환 할 수 있습니다 중 하나 C 스타일의 캐스트 또는 reinterpret_cast) - 그렇다고 반드시 결과를 사용할 수있는 것은 아닙니다.

이러한 변환 결과는 uint32_t 개체를 포함하도록 올바르게 정렬 된 주소를 가리 키지 않을 수 있습니다. 예를 들어 unsigned char*은 홀수 번째 주소를 가리킬 수 있습니다. uint32_t이 짝수 정렬을 필요로하는 경우 결과를 역 참조하려고 할 때 정의되지 않은 동작을 보입니다.

어떻게 든 보장 할 수 있다면 unsigned char*으로 올바르게 정렬 된 주소를 가리 키지 만 괜찮습니다.

+3

나는 downvote에 대한 설명을 주시면 감사하겠습니다. –

0

faranwath에서 제안한대로 reinterpret_cast을 사용할 수 있지만 해당 경로로 갈 위험이 있음을 이해하십시오.

리틀 엔디 언 시스템과 빅 엔디 언 시스템에서는 되돌아 오는 값이 근본적으로 다릅니다. 귀하의 방법은 두 경우 모두에서 작동합니다.

관련 문제