2013-11-01 1 views
2

나와 내 친구가 긴 장거리에서 아주 이상한 문제를 만났습니다. 기본적으로 내 컴퓨터에는 64 비트 프로세서가 있지만 32 비트 시스템이 있습니다. 그는 32 비트 OS와 CPU를 모두 가지고 있습니다.C++ - 말도 안되는 장거리

먼저 우리는 sizeof(long long)을 인쇄했습니다. 나이 들어

long long blah = 1; 

printf ("%lld\n", blah<<40); 

는 (올바른 결과입니다) 1099511627776를 반환 : 우리 모두를 위해 그것이 우리가 이런 짓을 그런

8.이었다. 그를 위해 그것은 0입니다.

어떻게 가능합니까? 우리 둘 다 같은 크기입니다.

미리 감사드립니다.

편집 : 코드 블록 12.11을 사용하여 Win7에서 컴파일하고 실행했습니다. 그는 Win XP와 CB의 같은 버전을 사용합니다.

EDIT2 : 요청에 따라 소스 코드 :

#include <cstdio> 

int main() 
{ 
    long long blah = 1; 

    printf ("%lld\n", blah<<40); 

    return 0; 
} 

#include <cstdio> 

int main() 
{ 
    printf ("%d", sizeof(long long)); 

    return 0; 
} 
+3

만약 내가 추측해야만한다면 그의 코드가 당신과 약간 다르다 - 예를 들어 그는 "% lld"대신에 "% ld"를했을 것이다. 대신에'cout'을 대신 사용하여 결과를 알려주시겠습니까? – rabensky

+0

우리 모두 똑같은 프로그램을 운영했는데, 나는 그에게 나의 코드를 보냈다. – szczurcio

+1

* 완전한 * 프로그램 ('# include' 지시자와'main'의 완전한 정의 포함)을 보여주십시오. –

답변

3

나는 당신과 당신의 친구들이 악명 높은 MSVCRT.DLL 또는 다른 라이브러리의 다른 버전에 연결되어 있다고 생각합니다.

Q : 코드 :: 블록 자주 묻는 질문에서

어떤 코드 :: 블록 아닌가요?

A : Code :: Blocks는 컴파일러도 아니고 링커도 아닙니다. Code :: Block의 릴리스 패키지에는 이미 대상 플랫폼에서 제공하지 않은 경우 컴파일러 제품군 (MinGW/GCC)이 포함될 수 있습니다. 그러나 이것은 "있는 그대로"제공되며 Code :: Blocks 개발 팀에서 개발/유지 관리하지 않습니다.

"코드 블록 12.11을 사용하여 Win7에서 컴파일하고 실행했습니다."라는 문구는 정확하게 적용되지 않습니다. 컴파일러가 아닌 다른 것으로 컴파일 할 수 없습니다.

2 명이 실제로 사용하는 컴파일러 (위의 "코드 블록"참조)와 라이브러리를 확인합니다.

1

이 두 가지 문제 중 하나가 될 수 없습니다 : 중 오래 오래 또는 이동 연산자에 대처할 수없는 인쇄 시스템 이상 작동하지 않습니다 32 비트. 시도해보십시오

#include <cstdio> 
int main() 
{ 
    union 
    { 
     long long one; 

     // Intel based systems are back to front 
     struct { 
     long lo; 
     long hi; 
     } two; 
    } xxx; 

    xxx.one = 1LL; 
    xxx.one = xxx.one << 40; 
    printf ("%016llx %08x %08x\n", xxx.one, xxx.two.hi, xxx.two.lo); 
    return 0; 
} 

첫 번째 숫자가 모두 0이지만 다른 두 숫자 중 하나가 아닌 경우에는 대처할 수없는 printf입니다. 모든 숫자가 0이면 시프트 연산자는 64 비트에 대해 정의되지 않습니다.

관련 문제