2012-09-04 3 views
1

서명 된 DWORD를 Unsigned DWORD로 변환하는 방법?Dword와 서명이없는 Dword에 2의 보수가 없으면 서명 되었습니까?

나는 2의 보수를하는 한 가지 방법이 있습니다.

하지만 내가했을 때, 컴파일러는 부호있는 숫자에 대해 비트 연산이 허용되지 않는다는 오류를 제공합니다 (MISRA 규칙 2004 12 번째 규칙에 따라).

그렇다면 어떻게 서명되지 않은 Dword로 변환 할 수 있습니까?

long int num1,num2, 
unsigned long int num3; 

num1 = 293; 
num2 = 296; 

num3 = num1 - num2; 

코드를 실행하면 num3이 some 0xue와 같은 0xFFFFFFE 일부로드됩니다.

하지만 실제로 원하는 값 3을 저장해야합니까?

그래서 나는 unsigned long int num3을 long int num3으로 만들었습니다.

그런 다음 num3 부호있는 값 (이 경우 -3)은 2의 보수를 수행하지 않고 3으로 변환해야합니까?

+0

부호없는 비트로 먼저 캐스팅 한 다음 비트 연산을 적용하십시오. –

답변

3

부호가있는 부호에서 부호가없는 부호로의 변환의 정의는 값의 계수를 취하므로 결과는 항상 이 2의 보수 시스템에서 원시 비트를 취함으로써 얻을 수있는 결과와 일치합니다. 하지만 너 을 변환하고 싶지 않다. -3; 거리를 변환하려면 차이의 절대 값은 abs(num1 - num2)입니다.

+0

하지만 임베디드 C에서는 abs 함수가 허용되지 않습니다. 그런 경우 어떻게 변환합니까? – danison

+1

@danison :'num3 = (num1

+0

@danison 왜 안 되니? ('std :: abs'를 사용할 수 없다면, 직접 작성하는 것이 쉽습니다.) –

0
long num3; 
... 
if (num3<0) num3=-num3; 

또는 정확히 무엇이 문제입니까?

+0

'num3'이 부호없는 타입을 가지고 있다면, 그 값은 결코 0보다 작지 않을 것입니다. –

관련 문제