2017-03-19 4 views
2

리터럴 식에도 형식이 있습니까?C++ 리터럴 정수 형식

long long int a = 2147483647+1 ; 
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649 
+0

을 생산하고 있습니다. –

+0

이것을 확인하면 모든 의문점이 해결됩니다. http://stackoverflow.com/questions/1819189/what-range-of-values-can-integer-types-store-in-c – divyum

+1

보이지 않습니다. long long에 관한 질문은 "리터럴 표현식에도 형식이 있습니까?"라는 질문과 어떻게 관련이 있습니까? –

답변

6

예, 문자 숫자에는 유형이 있습니다. 접미사가 붙지 않은 10 진 정수 리터럴 유형은 int, long, long long 중 첫 번째 정수로 나타낼 수 있습니다. 2 진수, 16 진수 및 8 진수의 유형은 유사하게 선택되지만 목록의 부호없는 유형도 사용됩니다.

U 접미사를 사용하여 서명되지 않은 형식을 사용할 수 있습니다. 접미어에 L을 하나만 사용하는 경우 유형은 long 일 수 있지만 long으로 표시 될 수없는 경우 유형은 long long 일 수 있습니다. LL을 사용하는 경우 유형은 long long이어야합니다.

결과는하다 int 32 비트 유형이고 long는, 64 비트는 다음 2147483647longint2147483648 동안 입력했다 입력 경우. 즉, 2147483647+1은 오버플로 (이는 정의되지 않은 동작 임)이며 2147483648+1은 간단히 2147483649L입니다.

이것은 C++ 표준의 § 2.3.12 ([lex.icon]) 단락 2에 의해 정의되며 위의 설명은 해당 섹션의 표 7에 대한 요약입니다.

할당 대상의 유형은 어떤 식 으로든 할당 오른쪽의 표현식 값에 영향을 미치지 않습니다. 계산을 long long 결과로 강제하려면 계산의 일부 인수를 강제로 long long으로 설정해야합니다. 단지 long long 변수에 할당하는 것은 충분하지 않다 : 요는 'A + 1` 첫째을하고 오래 오래에 캐스팅 때문에

long long a = 2147483647 + 1LL; 
std::cout << a << '\n'; 

2147483648 

(live on coliru)

+0

가장 작은 정수 유형을 사용해야합니다 – m7913d

+1

@ m7913d : 예, 표준은 정확히 "해당 목록의 첫 번째"라고 말하면서 인용문을 추가했습니다 (표현할 수있는 가장 작은 정수 유형이 아니며 – rici

+0

@rici :''a''와 같은 리터럴 char은''char'' 타입이 될 것입니다 (C와는 달리, 'int'를 입력하십시오.) – rodrigo

0
int a = INT_MAX ; 
long long int b = a + 1 ; // adds 1 to a and convert it then to long long ing 
long long int c = a; ++c; // convert a to long long int and increment the result with 1 
cout << a << std::endl; // 2147483647 
cout << b << std::endl; // -2147483648 
cout << c << std::endl; // 2147483648 
cout << 2147483647 + 1 << std::endl; // -2147483648 (by default integer literal is assumed to be int) 
cout << 2147483647LL + 1 << std::endl; // 2147483648 (force the the integer literal to be interpreted as a long long int) 

당신은 정수 리터럴 here에 대한 자세한 정보를 찾을 수 있습니다.

+2

2147483647은 'int' 유형일 수 있지만 긴 유형일 수도 있습니다. 또한 2147483647 + 1은 정수 오버플로가 될 가능성이 있으며, 이는 -2147483648이 아니지만 정의되지 않은 동작입니다. 마지막으로 2147483647L + 1 또한 오버플로 할 수 있습니다 (Microsoft 컴파일러에서도 마찬가지입니다). –

+0

@MartinBonner 필자는 Windows에서 64 비트 인 long long을 사용하도록 내 대답을 변경했습니다. C++ 표준에 따른 정의되지 않은 동작이지만 거의 항상 2 보수 오버플로로 구현되며 이는 OP가 인식 한 동작입니다. – m7913d

+0

@MartinBonner rici의 답변에 따르면, 정수 (int가 32 비트라고 가정 할 경우) – m7913d