본문 바로가기

컴퓨터 과학 & 영상처리 관련/C / C++

if(a < 1u), if(3 < -2U)

下のcodeで 1u 2Uはなんですか?

void main(void)
{
int a = -1;

if(a < 1u) printf("True");
else printf("False");
}
//結果 False

void main(void)
{
if(3 < -2U) printf("Large : %d\n", -2U);
else printf("Large : %d\n", 3);
}
//結果 Large : -2




보충에의 회답이 됩니다.

1u와 1은 「형이 틀린다」라고 말하는 큰 차이가 있습니다.
내부의 비트 표현이 이러니 저러니가 아니고, 「형이 틀린다」 곳에 C의 처리에서의 큰 차이가 나옵니다.
# 개인적으로는 내부표현따위 최초부터 걱정하는 것 같은 성질의 물건이 아니다고 생각하고 있습니다.

우선, -1과 1u를 비교하고 있을 경우입니다만, ·-1은 int형, 1u는 unsigned int형이므로 integer conversion rank는 마찬가지다 ·int형과 unsigned int형의 연산이므로, int형은 unsigned int형으로 변환된다 ·값을 unsigned int형으로 변환하기 위해서는, (UINT_MAX +1)에 상당하는 값을 가산 또는 계속해서 감산하는 것으로 행하여지는 것이, 규격(ISO/IEC 9899:1999)로 결정되어 있습니다.
구체적으로는, 6.3 Conversions - 6.3.1 Arithmetic operands의, 6.3.1.1 Boolean, characters, and integers 및 6.3.1.8 Usual arithmetic conversions가 됩니다.

그런데, 계산이 번거로우므로 UINT_MAX가 65535의 처리계를 생각하니, if (a < 1u)은, if (- 1 <1u)과 등가이어서, 게다가, if ((unsigned int) (-1+ (UINT_MAX +1UL)) <1u)과 등가가 되고, 결국은 if ( 65535u < 1u)이라고 등가이어집니다. 따라서, if 안(속)은 가짜가 되고, False가 표시됩니다.

그 다음에, (3 <-2u)만, 우선, -2u에 대해서, ·값을 unsigned int형으로 변환하기 위해서는, (UINT_MAX +1)에 상당하는 값을 가산 또는 계속해서 감산하는 것으로 행하여지지만 적용됩니다.
-2u는 (unsigned int) (-2+ (UINT_MAX +1UL))에 상당하고, 전번의 예에서는 65534u가 됩니다.
그 다음에, 3은 그대로 3u가 됩니다 (표현할 수 있으므로).
if ( 3 <-2u)은 if ( 3u < 65534u)이라고 등가가 됩니다. 이 if 안(속)은 진이기 때문에, printf(”Large :%dn”, -2U);이 처리됩니다.
여기에서 -2이라고 표시된다고 쓰지 않는 것은, -2U라고 말하는 「unsigned int」의 값을 %d에 건네고 있기 때문에, 엄밀하게는 undefined behavior이기 때문입니다.
# 결국은 정확하지 않은,이라고 하는 것.

 

'컴퓨터 과학 & 영상처리 관련 > C / C++' 카테고리의 다른 글

주석  (0) 2011.05.15
\r\n  (0) 2011.05.14
typedef 사용법  (0) 2011.05.13
데이터형의 종류와 값의 범위  (0) 2011.05.11
10진수 -> 2진수 변환  (0) 2011.05.09