2014-09-25 2 views
0

부호로 변환하거나 부호로 변환하는 두 가지 기능을 구현해야합니다. 나는 C++ 11과 리눅스를 사용하고있다.부호있는 부호없는 부호로 또는 부호 부호로 변환하기

시스템은 2의 보수이며 char, int, long 등을 사용할 수 있습니다. 인터페이스는 명시된대로 있어야하며 뭔가 구현하려고했습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 이게 맞습니까? 어떻게 비트 수를 기반으로 구현을 변경할 수 있습니까? 조언이 필요해.

uint32_t signedToUnsigned(int32_t x, uint8_t bits) 
{ 
    return (x > 0 ? x:-x); 
} 

int32_t unsignedToSigned(uint32_t x, uint8_t bits) 
{ 
    if(x <= INT_MAX) 
     return static_cast<int>(x); 

    if(x >= INT_MIN) 
     return static_cast<int>(x - INT_MIN)+ INT_MIN; 
    else 
    { 
     printf("ERROR"); 
     return x; 
    } 
} 

편집 :

이는 HW와 함께 사용됩니다 나는이 비트에서 지정할 필요가있다. 그래서, 대신 같은 비트없이 과부하 한 기능의 의존성이있는의 ... 18bits 또는 4 등으로

+1

여기서 두 번째 인수 비트는 무엇입니까? –

+0

'unsignedToSigned()'함수가 깨졌습니다. 'x'가'INT_MAX'보다 크거나'INT_MIN'보다 작은 경우를 생각해 보면, 제가 의미하는 바를 알 수 있습니다. 인수가'int32_t' (32 비트 고정) 인 경우, 그 비트가 몇 비트인지 결정합니다. 그렇지 않습니까? 모두 당신의 질문이 무엇인지 알기가 힘들다. – DevSolar

+0

아마도 int 나 char 등의 타입을 기반으로 코드를 바꿀 필요가 있는지 궁금하다. – user1876942

답변

1

을 반환 형식의 값을 제한해야 할 수도 등

uint32_t signedToUnsigned(int32_t x); 
uint64_t signedToUnsigned(int64_t x); 
uint16_t signedToUnsigned(int16_t x); 

하고 있습니다. 그러나 간단한 static_cast가 수행해야합니다. How does one safely static_cast between unsigned int and int?

+0

static_cast를 확인해 보겠습니다. 다른 방향으로가는 건 어때? 서명 했어? – user1876942

+0

비슷하게 signedToUnsigned로 갈 수 있습니다 –

+0

@ user1876942 :'signedToUnsigned()'는 ['std :: abs()']로 구현됩니다 (http://en.cppreference.com/w/cpp/numeric/math/abs).) ("절대 값") 표준 라이브러리 (). – DevSolar

1

번호를 왕복 여행에서 생존하려면 기능이 좋지 않습니다. 예를 들어

: std::cout << unsignedToSigned(signedToUnsigned(-13, 0), 0); // prints 13 NOT -13

static_cast은 왕복 살아남을 것입니다 :

std::cout << static_cast<int32_t>(static_cast<uint32_t>(-13)); // prints -13 그래서 나는 static_cast 당신이 명확 사양과 질문을 업데이트 할 수 있습니다하지 않는 한 당신이 원하는 생각합니다.

관련 문제