2016-11-15 13 views
0

stringstream을 사용하여 데이터를 변환했으며 하나의 경우를 제외하고는 매우 효과적이었습니다.부호있는 16 진수 숫자의 출력 형식 지정

나는 음수 또는 양수가 될 수있는 정수 값 두 개를 뺍니다. 그 값을 받아 을 사용하여 stringstream 개체로 보내고 std::cout으로 덤프합니다.

내 문제는이 값에 대한 내 필드는 3 자리 길이 일 수 있으며 음수 값을 얻으면 너무 많은 선도 F가 붙습니다. 도움이되는 표준 기능을 사용할 수 없습니다 (setw, setfill, ...).

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

예 : 출력 크기가 12 비트 최대 인 값을 시도하고

ss << hex << value - LocationCounter; 
+0

침범 유형이 실제로 무엇입니까? '서명되지 않은 int', 포인터? –

+0

부호 확장 기능에 익숙합니까? – user4581301

+2

한가지 들어,'-9'는'FF..FF9'가 아니라'FF..FF7'입니다. –

답변

1

내 이제 stringstream 객체 SS에 값을 보낼 수

Value - Value = -9, So what I want is FF9 but what I get is FFFFFFF9. 

내 코드입니다. 12 비트 데이터 유형이 없으므로 가장 가까운 값은 상위 4 비트를 0으로 설정 한 16 비트 부호 유형을 사용하는 것입니다. 예를 들어 8 비트 부호 유형으로 원하는 값을 계산하십시오.) -128 .. 127 그것의 유효 범위를 감소시킬 것이며, 그 다음, 16 비트 부호 형에 로그인 연장 상위 4 개 비트를 제로 및 헥스 마지막으로 결과를 출력 :

signed char diff = (signed char)(value - LocationCounter); 
// the setw() and setfill() are used to pad 
// values that are 8 bits or fewer in size... 
ss << hex << setw(3) << setfill('0') << (((signed short)diff) & 0x0fff); 

이 값을 다시 읽기 위해서는 읽을 signed charsigned short 다음 잘라 그 값에 12 비트 진수 :

signed short tmp; 
ss >> hex >> tmp; 
signed char diff = (signed char)tmp;