2014-09-21 2 views
0

줄을 이해할 수 없습니다. "시프트 결과는 시프트 된 것과 동일한 유형입니다 완전한 판촉 후) " 다음은 Mike Banahan의 C 책에서 발췌 한 것 (Section 2.8.2.3).설명해 주시겠습니까? "혼합 유형의 피연산자가 포함 된 규칙은 시프트 연산자에 적용되지 않습니다.

혼합 유형의 피연산자가 관련된 규칙은 을 시프트 연산자에 적용하지 않는 것이 중요합니다. 이동 결과에는 (통합 프로모션 이후) 이동 한 것과 동일한 유형이 있고 은 다른 것에 의존합니다.

뭔가 이미 (시프트 연산자를 사용하는 동안 필요에 따라) 정수 원래했다으로 물론 그것이 오른쪽에있는 경우를 제외하고, 다음은, 동일한 유형으로 다시 방법을 변환 할 수 있습니다로 승진하는 경우 할당 이전에 정수 프로모션과 동일한 유형의 변수에 할당되고 있습니까? 또한, "피연산자의 혼합 유형을 포함하는 규칙은 시프트 연산자에 적용되지 않습니다"라는 라인이 정확히 무엇을 의미합니까?

질문의 두 부분을 모두 밝히십시오. 고맙습니다.

다음은 비트 단위 연산자 사용 중 및 혼합 식에서의 판촉 행사와 관련된 책자의 스크린 샷입니다.

enter image description here

enter image description here

답변

1

그것은 곧장 앞으로 꽤입니다; 시프트 연산의 결과 유형은 LHS 피연산자의 유형입니다. 대부분의 2 진 연산자의 경우 결과는 LHS 및 RHS 피연산자를 기반으로하지만 시프트 연산자는 다릅니다.

unsigned char  uc = 0x08; 
unsigned short  us = 0x0008; 
unsigned int  ui = 0x00000008; 
unsigned long long ul = 0x0000000000000008; 

는 (. 나는 세부 사항이 다른 경우 변경해야 할이 대답을 sizeof(unsigned int) == 4 있으리라 믿고있어,하지만 개념은 변경되지 않습니다.)

지금 어떤 표정을 고려 :

uc + uc; 

을 두 유형 모두 int으로 변환되고 결과는 int입니다.

us + us; 

다시 두 종류 int로 변환하고 결과 int이다.

us + ui; 
ui + us; 

us의 값이 unsigned int로 변환되고 결과 unsigned int (이전 값 일명 intsigned int 변환 된 참고)이다. 이러한 식의

ui + ul; 
ul + ui; 

모두는 unsigned long longui을 변환하고 결과는 unsigned long long입니다. 이 표현식은 대칭 적입니다. 결과 유형 (실제로는 + 연산자의 결과 값)은 LHS에있는 값과 연산자의 RHS에있는 값에 의존하지 않습니다.

정상적인 작동에는 많은 부분이 있습니다. 지금 교대는 어떨까요?

uc << uc; 

좌변은 일반적인 산술 변환하여 int로 변환되고 그 결과는 int이다.

us << us; 

이 결과는 int입니다.

ui << ui; 

이 결과는 unsigned int입니다.

ul << ul; 

이 결과는 unsigned long long입니다. 그러나 유형을 혼합하는 것은 어떨까요?

uc << ul; // Result: int 
ul << uc; // Result: unsigned long long 
us << ui; // Result: int 
ui << us; // Result: unsigned int 
ui << ul; // Result: unsigned int 
ul << ui; // Result: unsigned long long 

LHS 피연산자의 수준을 올린 형식이 결과 유형을 제어합니다. int보다 짧은 유형의 경우 결과는 int입니다. 다른 유형의 경우 유형은 LHS 피연산자의 유형입니다.

그게 모두 귀하의 견적 의미입니다.

+0

답변과 시간 내 주셔서 감사합니다. 나는 나의 질문에 대한 어떤 대답도 포기하고 이와 같은 좋은 것을 기대하지 않았다. – Thokchom