2013-02-19 2 views
0

unsigned long long 형식의 정확한 이진 형식은 무엇입니까 (적어도 Visual Studio에서는).다른 데이터 형식의 이진 형식

별칭 지정 포인터를 사용하여 비트 단위 연산을 수행 중이므로 unsigned char 포인터에 대한 연산을 통해 비트를 설정 한 다음 unsigned long long 포인터 (별칭)에서 다른 연산을 수행합니다.

unsigned long long의 형식은 이상한 보이는이 때문에 엉망 결과는, 또한, 그것은 비트 시프트 연산도 이상한 행동을 보인다

:

는 비트 마스크 테스트에서이 데이터가 보인다 right: LSB->MSB : left에서 정렬됩니다. 즉, >> 교대는 더 적은 비트가 아닌 더 중요한 비트로 데이터를 가져옵니다. 이것이 맞습니까?

컴파일러는 ICC 13.0이고 OS는 Windows 7-64입니다.

+1

아마 [endianness] (http://en.wikipedia.org/wiki/Endianness)에 대한 설명이 순서에 있습니다. –

+1

단일 바이트를 추출하기 위해 포인터 트릭 (char *)으로 캐스팅하는 것이 가능합니까? 이 경우 귀하의 혼란은 아마도 엔디안 문제에서 비롯된 것입니다. – us2012

+0

나는 unsigned char *를 사용하여 비트를 설정하고 다른 수학 연산을 처리 할 별칭 포인터를 사용합니다. – user0002128

답변

2

설명하는 바이트 레이아웃은 리틀 엔디안으로, 인텔 프로세서가 일반적으로 사용하는 레이아웃입니다. 비트 시프트는 숫자의 메모리 레이아웃이 아니라 값이므로 엔디안이 작업의 가치에 영향을주지 않아야합니다. 그러나 포인터 에일리어싱을 사용하여 char *으로 캐스팅하고 포인터 산술을 사용하여 세그먼트를 추출하면 엔디안 종속적 인 동작을 경험할 수 있습니다.이 동작은 리틀 엔디안 Intel 프로세서에서 예상했던 것과 다를 수 있습니다.

+0

너무 나쁘다. 문제를 해결할 방법이 있습니까? – user0002128

+0

엔디안을 신경 쓰지 않고 개별 바이트를 추출하려면 '(x >> 16) & 0xff'와 같은 shift-and-mask 연산을 수행하여 세 번째로 낮은 순서 바이트를 얻을 수 있습니다. –

+0

이 작업을 통해 심각한 성능 저하가 발생 했습니까? 여기에 몇 가지 앨리어싱 포인터가있는 주된 이유는 성능상의 이점입니다. 필요한 경우 64 비트 폭의 데이터 유형을 대신 사용할 수 있습니다. – user0002128