2013-05-07 3 views
3

msdev 2010과 함께 __int64 유형에 이상한 동작이 나타납니다. 어떤 일이 벌어지는지를 나에게 밝힐 수 있습니까?printf 64 비트 형식 지정자 문제

#include <stdio.h> 

int main() 
{ 
    int vl_idx; 
    unsigned __int64 vl_64; 
    unsigned __int64 vl_64_test; 

    for (vl_idx = 0; vl_idx < 64; vl_idx++) 
    { 
    vl_64 = 1 << vl_idx; 
    printf ("vl_64 (%d) = %I64u\n", vl_idx, vl_64); 
    printf ("vl_64 (%d) = %llu\n", vl_idx, vl_64); 
    printf ("vl_64 (%d) = %lu\n", vl_idx, vl_64); 
    } 
    vl_64_test = 1 << 31; 
    if (vl_64 > vl_64_test) 
    printf ("greater\n"); 
    if (vl_64 == vl_64_test) 
    printf ("equal\n"); 
    if (vl_64 < vl_64_test) 
    printf ("less\n"); 

    return 0; 
} 

출력은 처음 예상대로 ... 왜 __int64처럼 찾고 즉, 실제로는 32 비트 int이며 - 나는이 문제는 먼저 64 비트의 int, 두 번째 동작을 표시하는 방법을 여기에있다 생각 30 반복 :

vl_64 (0) = 1 
vl_64 (0) = 1 
vl_64 (0) = 1 
vl_64 (1) = 2 
vl_64 (1) = 2 
vl_64 (1) = 2 
... 
vl_64 (30) = 1073741824 
vl_64 (30) = 1073741824 
vl_64 (30) = 1073741824 
vl_64 (31) = 18446744071562067968 
vl_64 (31) = 18446744071562067968 
vl_64 (31) = 2147483648 
vl_64 (32) = 1 
vl_64 (32) = 1 
vl_64 (32) = 1 
vl_64 (33) = 2 
vl_64 (33) = 2 
vl_64 (33) = 2 
... 
vl_64 (62) = 1073741824 
vl_64 (62) = 1073741824 
vl_64 (62) = 1073741824 
vl_64 (63) = 18446744071562067968 
vl_64 (63) = 18446744071562067968 
vl_64 (63) = 2147483648 
equal 

그런데 상황이 좋습니까? 32 번째 반복에서. 이것은 디스플레이 문제 일 수 있지만, 결국 비교는 그렇지 않다는 것을 암시합니다. 이것은 msdev 2010 cl (64 비트 버전)로 컴파일되었고 64 비트 Windows OS (64 비트 CPU 사용)에서 실행 중이었습니다. 왜 비교 결과가 1 < < 31 == 1 < < 63일까요? int보다 넓은 것도, 예를 처리 할 때 어떤 제안에 대한

감사합니다,

답변

1

당신은 정수 리터럴에주의해야

vl_64 = 1 << vl_idx; 

에 :

vl_64 = 1LLU << vl_idx; 

그렇지 않으면 오른쪽은 int 표현으로 평가되는 첫 번째 암시 적으로 부호없는 64 비트 결과에 캐스팅되기 전에 당신은 변경해야합니다.

+0

예, 그게 전부입니다. 고마워. MS는 1LLU를 이해하지 못하는 것 같습니다. 그러나 1을 (부호없는 __int64)로 변환하면 동일한 결과를 얻을 수 있으며 예상대로 출력됩니다. –