2011-09-12 3 views
8

I 윈도우 XP에서 코드의 두 조각을 다음 (코드 : 블록,는 MinGW) 실행 및 우분투 (11.04, G ++)들고 2^63 -1 오래 오래

나는 문제가 다음 코드

을 실행이를
#include <iostream> 

using namespace std; 

int main(){ 

    long long a = 9223372036854775807; 
    cout << a; 
    return 0; 

} 

해당 숫자는 2^63 -1입니다. 이 코드를 실행하면 사용하는 지금 ....

그것을 컴파일하지만, retunred 대답은 9223372036854775808, 마지막에 팔을 알 수있다 -

우분투에

C:\Documents and Settings\JohnWong\My Documents\codeblock\343_hw_1\main.cpp|9|error: integer constant is too large for "long" type|

이 :하지만라는 오류가 발생합니다 힘 기능, 나는 좋다.

#include <iostream> 
#include <iomanip> 
#include <math.h> 
using namespace std; 

int main(){ 

    long long a = pow(2,64); 
    cout << "a: " << setprecision(20) << a << endl; 
    cout << "a-1: " << setprecision(20) << a-1 << endl; 
    cout << "a-2: " << setprecision(20) << a-2 << endl; 
    cout << "a+0: " << setprecision(20) << a+0 << endl; 
    cout << "a+1: " << setprecision(20) << a+1 << endl; 
    cout << "a+2: " << setprecision(20) << a+2 << endl; 
    cout << "a+3: " << setprecision(20) << a+3 << endl; 

    return 0; 
} 

나는 원하는 값을 얻을 것이다. (+1에서 어떤 것이 든 오버 플로우를 일으킬 것이다.)

우분투에서는 출력이 동일하게 보입니다. 좋은.

그래서 여기서 어떻게됩니까? 왜 상수가 좋지 않은가 ??? 심지어 첫 번째 코드를 실행하는 데이터 유형으로 intmax_t 및 int64_t를 시도했습니다.

누군가가이 동작을 설명 할 수 있습니까? 감사!

답변

13
long long a = 9223372036854775807LL; 

LL은 리터럴을 긴 긴 리터럴로 만듭니다. 그렇지 않으면 리터럴은 긴 리터럴로 기본 설정되고 a에 저장되기 전에 long long으로 형변환됩니다.

+0

@ 에릭, 음. 네. 그는 그가 게시물에 넣어 경고를 참조하십시오. 컴파일러가 자동으로 업그레이드되지 않는 이유는 무엇입니까? 잘 모르겠습니다. –

+0

'LL'은 필요하지 않습니다. "[접미사가없는] 정수형의 타입은 'int','long int','long long int'의 값을 표현할 수있는 [다음 목록]의 첫 번째 타입입니다." (C++ 11 2.14.2/2에서, C99에는 실질적으로 같은 것을 말하는 언어가 있고 C++ 03은 동일한 언어를 가지고 있지만'long long int '는 C++의 일부가 아니기 때문에 제외됩니다 03) . 'LL'을 추가하는 제안 된 솔루션이 일부 컴파일러에서 작동 할 수 있지만 필수 사항은 아닙니다 (Visual C++ 2010, g ++ 4.5.1 및 Clang 3.0 모두 'LL'없이 코드를 수락 함). –

+1

@James, 흥미 롭습니다. g ++ 4.4.3에 대한 경고가 나타납니다. 아마도이 컴파일러는 아직 C++ 11과 호환되지 않습니다. –

2

C++ 언어 전에 long long 형식이 없었습니다. 11. 귀하의 컴파일러는 명백히 C++ 11 컴파일러가 아니며, long long을 확장으로 지원합니다. 이것이 컴파일러가 경고를 발행하는 이유입니다. 그것은 리터럴이 비표준 (확장) 방식으로 해석된다는 것을 경고합니다. 즉, 리터럴에 적합한 유형을 검색하는 동안 컴파일러는 언어 표준 범위를 벗어나야합니다.

+0

@ C++ 11. 그래 맞아. 감사! – CppLearner

관련 문제