2016-07-29 2 views
-4

int 배열을 int16_t 배열로 C++ 또는 C로 저렴한 비용으로 변환하려면 어떻게해야합니까? int 배열의 모든 값이 int16_t 범위 내에 있다고 가정합니다.C++ int 배열을 int16_t 배열로 변환

I :

나는 두 가지 옵션을 알고있다. for 루프를 사용하여 int 배열의 각 요소를 int16_t 배열의 해당 요소에 할당합니다.

int *a = new int[2]; 
a[0] = 1; 
a[1] = 2; 

int16_t *b = new int16_t[2]; 

for (int i = 0; i < 2; i++) { 
    b[i] = a[i]; 
} 

하지만 복사가 필요하며 오버 헤드가 있습니다.

ii. 사용

int16_t* c = reinterpret_cast<int16_t*>(a); 

//1 0 2 0 
for (int i = 0; i < 4; i++) { 
    cout << (int)r[i] << endl; 
} 

캐스팅하지만 배열을 int16_t하는 int 배열 [2]를 전송하는 다른 저가의 방법이 있나요 그 0

싶지 않아 [2] 값을 유지?

+1

현대 아키텍처에는 가치를 버릴 가능성이 높습니다. 'int '는 더 이상 32 비트 또는 64 비트 (보장되지는 않지만 일반적으로 그렇게)이고'int16_t'는 16 비트로 보장됩니다.'int'가 시스템에서 32 비트라고 가정 할 때'int'를 ** two **'int16_t'로 근본적으로 바꾸고 있기 때문에 포인터의 재 해석은 여러분이 원하는대로되지 않을 것입니다. – Qix

+0

또한 int를 조각 한 이후로 두 번째 엔 큰 엔디안 아키텍처에서 놀라운 결과를 얻을 수 있습니다. reinterpret_cast 예제 –

+0

예. 그러나 값이 16 비트 정수 (int16_t)의 범위 내에 있음을 알고 있지만 다른 구성 요소에서 int 배열을받습니다. 따라서 [b] [i] = (int16_t) a [i]를 수행하면 [i]는 잘리지 않습니다. –

답변

3

당신은 (표준은가 기본 데이터 형의 정확한 크기에 대한 진술을 제공하지 않습니다) int의 크기에 대한 가정을 할 수 없기 때문에 당신이 여기 캐스트를 사용하는 멋진 트릭을 할 수 없습니다. 귀하의 예 :

int16_t* c = reinterpret_cast<int16_t*>(a); 

이 작동하지 않습니다 때문에 당신의 시스템의 유형 int는 두
int16_t 를 얻을 것이다 각 int에 대한 있도록 32 비트 오래 발생합니다. 귀하의 경우에는, 그렇게 두 번째 int16_t는 항상 내가 당신의 정수를 복사 제안 0


그래서 모든 값이 특정 범위에 속하는지 발생합니다. 다른 것은 조숙 한 최적화입니다.

+1

이것은 절대적인 정답입니다. 나를 때려. – Qix

+0

값이 32 비트 int로 저장되어 있지만 값이 16 비트 정수 (int16_t 또는 short도 사용할 수 있음)의 범위 내에 있음을 알고 있습니다. 복사에는 오버 헤드가 있고 구성 요소에는 높은 효율이 필요합니다. –

+0

메모리 레이아웃이 일치하지 않으면 단순히 데이터를 다시 해석 할 수있는 방법이 없습니다. 따라서 복사 이외에 할 수있는 일은 없습니다. 측정하기 전에 최적화하지 마십시오! 그것은 조숙 한 최적화입니다. – nshct

-1

복사를 피하고 int1_t6 배열을 사용하기 만할까요?

배열 요소의 크기를 늘리면 (어쩌면 어떤 플랫폼에 따라 다름), 각 액세스시 복사 또는 도우미 함수/캐스트를 사용해야합니다. 값이 여전히 작 으면 다른 int16_t으로 값을 수정해야하는 경우가 아니면 int16_t으로 값을 가지지 않습니다.

나는 정말 int16_t 일 때 값으로 무엇을해야하는지에 달려 있다고 생각합니다. 타겟 int16_t가 소스 INT보다 더 적은 비트로 표현되고

int16_t getArrVal(const unsigned index){ 
return array[index]; 
} 
0

때문에 (32 비트 이상) 비트들은 16 비트 32/64 비트에서 변환되어야한다. 첫 번째 해결책은 정확하지만 컴파일러는 작은 int에 대한 할당을 경고합니다. 할당의 오른쪽에있는 static_cast에서 int16_t로 경고가 사라집니다.

예, 변환을 통해 사본을 의미합니다.

관련 문제