2016-12-06 5 views
1

표제는 0x320000dd와 같은 16 진수를 10 진수로 변환하려고합니다. 내 코드는 양수에 대해서만 작동하지만 음수 10 진수를 나타내는 16 진수에서는 실패합니다. 여기 내 코드의 발췌 부분이 있습니다 :십진수로 정확하게 16 진수를 변환합니다. (또한 음수)

  cin>>hex>> x; 
     unsigned int number = x; 
     int r = number & 0xffffff; 

입력 내용은 16 진수이며, 컴퓨터는 자동으로 정수로 변환합니다. 내가 뭘 하려는지 16 진수의 피연산자를 받고 있으므로 마지막 24 비트. 0x32fffdc9 또는 0x32ffffff와 같은 음수 값에 대해 제 코드가 작동하도록 할 수 있습니까? 고마워요!

편집 : 나는 내 출력이되고 싶습니다

: 0x32fffdc9 -> -567 또는 는 0x32ffffff -> -1

그래서 그냥 일반 진수 값 대신 그것은 나에게 16,776,649을 제공합니다 상위 예제는 16777215입니다.

+1

@kiner_shah hex는 std :: hex가 가장 가능성이 큽니다. – Borgleader

+0

@Borgleader, 알겠습니다! :-) –

+0

오, 미안하지만, 나는 네임 스페이스 표준을 사용했다. 내 코드에서. 그래서 std :: hex는 아무것도 변경하지 않을 것입니다. :) – Jennan

답변

1

일반적으로 음수는 2's complement에 저장됩니다. 최상위 비트 (MSB)가 설정되지 않은 경우 숫자가 음수가 아닙니다. 즉, 32 비트 숫자를 24 비트 양수로 클램프하기 위해 숫자의 8-MSB를 설정 해제해야하는 것처럼 으로 설정하여 숫자로 8MSB를 클램프하도록 설정해야합니다 음수 : 그들이 설정되는 비트의 범위에 16 진수를 명확히하는 것처럼

const int32_t r = 0x800000 & number ? 0xFF000000 | number : number & 0xFFFFFF; 

vector<bool> 또는 bitset, 당신의 고려 가치가있을 수 있습니다.

+0

답변 해 주셔서 감사합니다. 영어는 모국어가 아니므로 완전히 이해하지 못하고 있습니다. 또한 이전 버전의 C++로 프로그래밍 중이며 int32_t를 사용할 수 없지만 MSB는 0x32ffffff의 경우 두 번째 이후에 첫 번째 f가 될 것입니다. 맞습니까? 음수를 암시하는 8 이상이면 평가할 수 있습니다. 나는 그것을 정확하게 이해 했는가? 또한, 내가 부정적인 것을 알고 나면, 그 값의 바로 앞에 '-'를 붙일 수는 없습니다. 맞습니까? 나는 differenlty가 맞는지 계산할 필요가 있습니까? – Jennan

+0

@ Jennan 1) 컴파일러가'int32_t'를 처리 할 수 ​​없다면 표준 컨테이너를 사용할 때 더 많은 가치를 두어야합니다. 2) 네, 24 비트 정수의 MSB가 음수인지를 정의 할 것입니다. 3) 아니오 , 음수 표현을 얻기 위해 24 비트 정수를 단순히 부정 할 수는 없으며'-'는 2의 보수 연산을 수행하고 24 비트 정수가 수정되기를 원하지 않으므로 함께 수행해야합니다. 마스크. –

+0

감사합니다. – Jennan