2016-08-24 5 views
1

의심스러운 자르기에 관한이 린트 경고와 관련된 질문을 읽었지만 여기서는 순전히 C 경우입니다. pCont->sig보풀 경고 : # 647 : 의심스러운 자르기

pCont->sig -= (signed int64_t)((sub2 << 8)/pCont->freq + 1); 

또한 64 비트 (유형 signed int64_t)를 체결하고, 양 및 sub2freq 32 비트 부호 같습니다 Warning #647 뜨면 여기서

다음 줄 것이다. 이 모든 것은 armcc로 컴파일됩니다.

이미 성공적으로 시도하지 않고 1을 부호없는 32 비트로 캐스팅하려고 시도했지만 문제가 지속됩니다.

내가 시도 할 수있는 것에 대한 아이디어가 있습니까? 아니면 여기서 잘못된 점이 있습니까?

+2

문제가 아니지만'int64_t'는 이미'signed'로 정의되어 있습니다. 사용시'signed'를 다시 지정할 필요가 없습니다. 예 : [이 고정 너비 정수 참조] (http://en.cppreference.com/w/c/types/integer). –

+2

'((int64_t) sub2 << 8)/pCont-> freq + 1'이 필요한가요? –

+1

스스로 대답해야 할 기본적인 질문 : "왜 음수가 될 수없는 경우 서명 된 유형을 사용하여 값을 저장하고 있습니까?" 그리고 표현식이 32 비트 이상의 유효 비트를 생성 할 수 없는데 왜 이것을 63 비트 값으로 저장합니까? " 그리고 "sub2가 너무 커서 값이 오버플로되면 어떻게됩니까?"에 대해 생각하지 않아도됩니다. 당신이 말할 수있을 때 "나는 그것을하기위한 것!"이라고 말할 수 있습니다. 경고를 억제 할 수 있습니까? –

답변

4

예를 들어 this reference about the warning

에서 n은 부호없는 INT 경우

(long) (n << 8) 

(long) n << 8 

는 않을 것 반면,이 메시지를 유도 할 수도 있습니다. 첫 번째 경우에는 시프트가 int 정밀도 에서 수행되고 모든 비트를 보유 할 수있는 유형으로 후속 변환이 있더라도 상위 8 비트가 손실됩니다. 두 번째 경우 에서 이동 된 비트는 유지됩니다.

이것은 귀하의 경우 정확히 맞는 것 또한 해결 방법을하는 방법을 보여줍니다.

+0

'lint' 경고가 사라졌습니다! 귀하의 설명은 확실합니다. 나는 행복하다. 내 상사가 행복하다. 나의 QA 동료는 행복하다 :-) –