2012-11-26 5 views
1

경우, 다음과 같은 코드를 가지고 할당하는 동안 일어날 않습니다언제 암시 적 형식 변환은

uint8_t value = 0xF0; 
uint16_t shift = 0x10; 
uint32_t result = value << shift; 

cout << "The Result is: " << result << endl; 

내가 출력이 0 될 것으로 기대를하지만, 대신했다 15728640.

내 질문

  • expresion이 => 0이 아니고 그 이후에 암시 적으로 을 결과 유형으로 변환합니까?
  • 이 동작은 표준입니까?
  • 이런 종류의 동작에 대한 추가 정보는 어디서 얻을 수 있습니까?

답변

2

value << shift을 쓸 때 value은 시프트하기 전에 암시 적으로 int으로 변환됩니다. 이것은 "정수 승격"이라고합니다. 이 특별한 경우에는 다른 규칙이 적용되지 않습니다.

정수 승격은 범위가 int에 맞는 모든 유형에 적용됩니다. int에 맞지 않으면 unsigned int이 시도됩니다. 둘 중 하나에 적합하지 않으면 정수 승격은 아무 것도하지 않습니다.

자세한 내용은 ... 음, 방금 스펙을 읽었습니다.

1

시프트 조작에는 int보다 좁은 유형을 int로 변환하는 "정수 승격"이 포함됩니다. 프로모션은 교대 전에 수행되므로보고있는 동작이 예상됩니다.

0

32 또는 64 비트 워드 머신에서 작업하는 경우, 시프트는 32 또는 64 비트 레지스터에 있습니다. 즉, 8 비트 "값"이 레지스터에로드되고 이동 된 다음 필요한 경우 최종 변수로 잘립니다.

그래서 "int"의 길이는 구현에 따라 다릅니다.

관련 문제