2011-04-11 7 views
1
unsigned__int64 difference; 
difference=(64*33554432); 
printf ("size %I64u \n", difference); 
difference=(63*33554432); 
printf ("size %I64u \n", difference); 

처음 #은 어리석게 큽니다. 두 번째 숫자는 정답입니다. 62에서 63으로 변경하면 어떻게 변화합니까?unsigned_int64에서 예기치 않은 동작이 발생했습니다.

첫 번째 값 18,446,744,071,562,067,968 번째 값은 정규화 달리, 정수 리터럴 형 int의 아니라면 2,113,929,216

미안 값이 64, 63이 아니라 63 및 62

+1

표시되는 결과를 추가 할 수 있습니까? 실제 * 코드도 게시 할 수 있습니까? ('difference3'이 없으므로이 값을 사용할 수 없습니다.) –

+0

죄송합니다. 코드가 매우 간단합니다. 분명히 차이가 아니라는 것을 의미했습니다 .3 죄송합니다. – Jake

+0

C++에는 'unsigned__int64'이 없습니다. 구현 관련 확장 프로그램이나 라이브러리를 사용 중입니다. 플랫폼을 명시하십시오. –

답변

10

이었다이다. 플랫폼을 사용 중이라면 int은 32 비트라고 가정합니다. 따라서 계산 (64*33554432)이 오버플로되고 음수가됩니다. 그런 다음이 값을 unsigned __int64으로 캐스팅 했으므로 매우 큰 양의 정수로 뒤집습니다.

짜잔 : 잘 작동하고 두 경우 모두에서 올바른 번호를 제공 GCC에

int main() 
{ 
    int a1 = (64*33554432); 
    int a2 = (63*33554432); 

    printf("%08x\n", a1); // 80000000 (negative) 
    printf("%08x\n", a2); // 7e000000 (positive) 

    unsigned __int64 b1 = a1; 
    unsigned __int64 b2 = a2; 

    printf("%016llx\n", b1); // ffffffff80000000 
    printf("%016llx\n", b2); // 000000007e000000 
} 
+0

@Matt : 정확히 내가 암시하는 바입니다. –

0

.

크기 2113929216 크기 2080374784

그것의 printf 버그 수 있을까? MSVC 또는 이와 유사한 서비스를 사용하고 있습니까? 디버거를 통해 단계별로 시도하고 각 평가 후에 차이점을 검사하십시오. 숫자가 바로 보이는 경우 printf 문제 일 수 있습니다. 그러나, 리눅스 gcc에서 그것은 맞습니다.

+0

죄송합니다. 값이 잘못되었습니다. 64 및 63으로 시도해 볼 수 있습니까? – Jake

관련 문제