2011-09-13 2 views
5

나는 정적 분석 도구를 통해 다음 코드를 공급 한 :C의 괄호는 비트 연산의 피연산자 결과 유형을 변경할 수 있습니까?

u1 = (u1^u2); // OK 

u1 = (u1^u2) & u3; // NOT OK 

u1 = (u1^u2) & 10; // NOT OK 

u1 = (u1^u2) & 10U; // NOT OK 

u1 = (unsigned char)(u1^u2) & 10U; // OK 

u1 = (unsigned char)(u1^u2) & u3; // OK 

는 "OK"정적 분석 도구는 불평하지 않았 음을 의미합니다. "NOT OK"는 정적 분석 도구가 비트 연산의 일부 피연산자가 부호없는 정수가 아니라고 불평했다는 의미입니다. 마지막 두 라인에서

결과 괄호 원인 중

것을 보여준다. 실제의 형식 변환으로 부호 첨부

b. 정적 분석 도구가 타입 변환으로 생각한다고 생각하는 것

(b)에 대해서는 정적 분석 도구 개발자에게 문의 할 것입니다.

하지만 내가하기 전에 아마도 C 언어가 (a)로 알려져 있는지 알고 싶습니다.

답변

6

int 아래에 C의 내용이 없습니다. 예를 들어, 두 개를 더할 때, 추가하기 전이라도 피연산자는 기본 판촉에 따라 int으로 변환됩니다. 마지막 줄

unsigned char u1, u2, u3; 
u1 = 0; 
u2 = 42; 
u3 = u1 + u2; 

, 제 u1u2int로 변환 한 후 + 연산자는 int 값을 획득하기 위해 적용되며, 그 값은 당연히 컴파일러 단축키를 사용할 수있다 ( unsigned char로 다시 변환한다!)

+0

감사합니다. @pmg! 질문 제목에 "괄호"라는 단어를 남기겠습니다. 왜냐하면 이제는 관련성이 없다는 것을 알았지 만 다른 사람들도 문제의 원인이 무엇인지 생각하고 검색하여이 대답을 찾을 수 있기 때문입니다. 이제이 좋은 대답은 "C 정수 승격 규칙을 배우는"특별한 경우라는 것을 이해합니다. 많은 참고 문헌이 있습니다 (이제 내가 뭘 찾아야할지 알았습니다). 예 : http://tinyurl.com/62fm8yl on stackoverflow 및 href = "http://www.lysator.liu.se/c/rat/c2.html#3-2"- "서명되지 않은 보존 및 값"에 대한 설명 보존 ". – talkaboutquality

3

이것은 C에서 두 개의 unsigned char : s에 대한 결과 작업 유형이 int이기 때문입니다. 정적 분석 도구는 &int에 적용된다는 사실을 (매우 직관적이지는 않지만) 올바르게보고합니다.

관련 문제