C 언어상에서 큰 수를 작은 type 에 넣는경우

girneter의 이미지

예를 들어
unsigned int i = 0x1FF;
unsigned char ch = i;

라고 하면 제 컴파일 환경에서는
ch 가 0xFF 값을 갖게 됩니다
경고 메시지도 나오지 않구요.

C 표준( C99 와 ANSI-C )에서는 이렇게
큰 수를 작은 type 에 넣을 경우
어떻게 하도록 되어 있나요?
undefined 인가요?

C++ 표준은 어떤가요?

doldori의 이미지

정수형 변환의 경우 변환 후의 형의 유부호인지 무부호인지에 따라 달라집니다.

1. 변환 후의 형이 무부호이면 modulo 연산에 의해 변환됩니다. 위 코드의 경우
unsigned char로 표현 가능한 값을 가질 때까지 (UCHAR_MAX+1)을 반복적으로
더하거나 뺀 값이 결과입니다. UCHAR_MAX == 0xFF 라고 가정하면
(0x1FF - (0xFF + 1)) == 0xFF가 변환 후의 결과가 됩니다.

2. 변환 후의 형이 유부호이면 implementation-defined입니다.

C99와 C++ 표준이 표현은 다르게 하지만 결국 같은 얘기를 하고 있습니다.
제가 C90 표준은 갖고 있지 않아서 확인은 하지 못했지만 마찬가지일 거라고 생각합니다.