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를 시도했습니다.
누군가가이 동작을 설명 할 수 있습니까? 감사!
@ 에릭, 음. 네. 그는 그가 게시물에 넣어 경고를 참조하십시오. 컴파일러가 자동으로 업그레이드되지 않는 이유는 무엇입니까? 잘 모르겠습니다. –
'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'없이 코드를 수락 함). –
@James, 흥미 롭습니다. g ++ 4.4.3에 대한 경고가 나타납니다. 아마도이 컴파일러는 아직 C++ 11과 호환되지 않습니다. –