2016-08-14 4 views
3

조금 답답한 답변을 찾으려고했지만 명확한 답변을 찾을 수 없었습니다.
나는 그가 보조 노트로 쓴 this 대답했다 :부호없는 long long에서 unsigned int로 변환

규칙은 서명되지 않은 유형의 다른를; 부호가 있거나 부호없는 정수를 부호없는 유형으로 변환 한 결과는 잘 정의되어 있습니다.

그럼 은 정확히 정의 된의 동작입니까?
unsigned long long에서 unsigned int으로 변환 할 때 정의 된 동작이 있습니까? 32 MSB의 정보를 차단하는 것입니까? (32 LSB의 나를 떠나).
sizeof(unsigned int)4이고 sizeof(unsigned long long)8이라고 가정합니다.
캐스팅하지 않고 할당 할 때와 캐스팅을 할당 할 때 다른 동작이 있습니까?

답변

4

이 표준은 말한다 :

6.3.1.3 서명 및 부호없는 정수 값 에 의해 표현 될 수있는 경우 정수 유형의 값이 _Bool 이외의 다른 정수형으로 변환됩니다
1 새로운 유형, 그것은 변하지 않습니다.
2 그렇지 않으면 새 유형이 부호가없는 경우 을 반복 적으로 추가하거나 으로 표시 할 수있는 최대 값보다 1을 뺀 값이 새 유형의 범위에 속할 때까지 값이 변환됩니다. 49)
그렇지 않으면 새 형식이 서명되고 값을 으로 표시 할 수 없습니다. 결과가 구현에 의해 정의되거나 구현 정의 된 신호가 발생합니다.

포인트 2는 모듈로 연산을 설명하며이 경우 MSB를 잘라내는 것과 동일한 효과가 있습니다. (새로운 유형의 최대 값에 1을 더한 값이 숫자 기반의 힘일 때와 같은 효과가 있습니다.)

캐스팅을 사용하면 차이가 없습니다.

+0

표준을 인용하고 특정 사례에 답해 주셔서 감사합니다. –

관련 문제