2014-12-20 6 views
2

나는이 같은 일부 코드가 음수 :__builtin_clz는()

int foo(unsigned long long x) { 
    unsigned int x1 = (unsigned int)(x >> 32); 
    unsigned int x2 = (unsigned int)(x); 

    if (x == 0) { 
     cout << x1 << " " << __builtin_clz(x1) << endl; 
     cout << x2 << " " << __biultin_clz(x2) << endl; 
    } 
} 

x = 0의 출력은 다음과 같습니다

0 587581823 
0 -32 

그리고 가장 이상한 것은 항상 여기 587581823 동일하다 __builtin_clz(x1)이다 다른 난수 (0보다 작음) 및 __builtin_clz(x2)은 항상 -32

+4

는'정의되지 않은 __builtin_clz' 아닌가요 정의되지? 그것은 귀하의 경우에 보장됩니다. – amaurea

+0

@amaurea이 정의를 할 수있다, 난 정말 몰라. 나는 조금 검색 및 모든 장소에 나는이 정의되지 않은 경우 (32)가 다음 첫 번째 큰 난수 괜찮습니다 보았지만, 왜 두 번째 숫자는 항상 -32 다음입니까? – PepeHands

+1

@Dima : "정의되지 않은"은 실제로 나쁜 카테고리입니다. "노란색"도 유효한 결과입니다. 세부 사항을 추론하려고하지 마십시오. – MSalters

답변

4

입니다. __builtin_ctz 대한 gcc documentation에서 k는 우리가 가지고

내장 함수 : int __builtin_ctz (unsigned int x)

최하위 비트 위치에서 시작하는, X는 0 비트를 후단의 수를 반환. x가 0이면, 결과는 정의되지 이다. [강조 광산]

불확정는 정의되지 않는다. 결과로 볼 수있는 완전히 임의의 숫자는 "정의되지 않은"범위 내에 있습니다.

3

당신은 0

docs의 값으로 __builtin_clz 사용할 수 없습니다은 말한다 :

- 내장 기능 : INT의 __builtin_clz (서명 INT X가) 0 - 선도의 수를 돌려줍니다 비트는 x에서 가장 중요한 비트 위치에서 시작합니다. x가 0 인 경우, 결과는 인수가 제로의 경우